{"version":3,"sources":["webpack:///./cartridges/app_designholding/cartridge/client/default/js/components/button-loader/button-loader.js","webpack:///./cartridges/app_designholding/cartridge/client/default/js/components/button-loader/index.js","webpack:///./cartridges/app_designholding/cartridge/client/default/js/components/signin-form/signin-constraints.js","webpack:///./cartridges/app_designholding/cartridge/client/default/js/components/signin-form/signin-form.js","webpack:///./cartridges/app_designholding/cartridge/client/default/js/components/signin-form/index.js","webpack:///./cartridges/app_designholding/cartridge/client/default/js/utilities/errors/add-alert-message/add-alert-message.js","webpack:///./cartridges/app_designholding/cartridge/client/default/js/utilities/errors/add-alert-message/index.js","webpack:///./cartridges/app_designholding/cartridge/client/default/js/utilities/errors/create-message-string/create-message-string.js","webpack:///./cartridges/app_designholding/cartridge/client/default/js/utilities/errors/create-message-string/index.js","webpack:///./cartridges/app_designholding/cartridge/client/default/js/utilities/errors/api-error-handler/api-error-handler.js","webpack:///./cartridges/app_designholding/cartridge/client/default/js/utilities/errors/api-error-handler/index.js","webpack:///./cartridges/app_designholding/cartridge/client/default/js/utilities/errors/error-handler/error-handler.js","webpack:///./cartridges/app_designholding/cartridge/client/default/js/utilities/errors/error-handler/index.js","webpack:///./cartridges/app_designholding/cartridge/client/default/js/utilities/serialize-object/serialize-object.js","webpack:///./cartridges/app_designholding/cartridge/client/default/js/utilities/serialize-object/index.js","webpack:///./cartridges/app_designholding/cartridge/client/default/js/utilities/validation/validators/date-nl.js","webpack:///./cartridges/app_designholding/cartridge/client/default/js/utilities/validation/validators/has-house-number.js","webpack:///./cartridges/app_designholding/cartridge/client/default/js/utilities/validation/validators/house-number.js","webpack:///./cartridges/app_designholding/cartridge/client/default/js/utilities/validation/validators/house-number-addition.js","webpack:///./cartridges/app_designholding/cartridge/client/default/js/utilities/validation/validators/is-eighteen.js","webpack:///./cartridges/app_designholding/cartridge/client/default/js/utilities/validation/validators/email-exists.js","webpack:///./cartridges/app_designholding/cartridge/client/default/js/utilities/validation/validators/min-age.js","webpack:///./cartridges/app_designholding/cartridge/client/default/js/utilities/validation/validators/checked.js","webpack:///./cartridges/app_designholding/cartridge/client/default/js/utilities/validation/validators/index.js","webpack:///./cartridges/app_designholding/cartridge/client/default/js/utilities/validation/helpers/single-async-validator.js","webpack:///./cartridges/app_designholding/cartridge/client/default/js/components/shipping-form/gift-constraints.js","webpack:///./cartridges/app_designholding/cartridge/client/default/js/utilities/form/form.js","webpack:///./cartridges/app_designholding/cartridge/client/default/js/utilities/form/index.js","webpack:///./cartridges/app_designholding/cartridge/client/default/js/utilities/parse-json/parse-json.js","webpack:///./cartridges/app_designholding/cartridge/client/default/js/utilities/parse-json/index.js","webpack:///./cartridges/app_designholding/cartridge/client/default/js/utilities/store/lib/component.js","webpack:///./cartridges/app_designholding/cartridge/client/default/js/utilities/store/store/store.js","webpack:///./cartridges/app_designholding/cartridge/client/default/js/utilities/validation/regex/only-words.js","webpack:///./cartridges/app_designholding/cartridge/client/default/js/utilities/validation/regex/password.js","webpack:///./cartridges/app_designholding/cartridge/client/default/js/utilities/validation/regex/ean.js","webpack:///./cartridges/app_designholding/cartridge/client/default/js/utilities/validation/regex/date-nl.js","webpack:///./cartridges/app_designholding/cartridge/client/default/js/utilities/validation/regex/email.js","webpack:///./cartridges/app_designholding/cartridge/client/default/js/utilities/validation/regex/phone.js","webpack:///./cartridges/app_designholding/cartridge/client/default/js/utilities/validation/regex/zipcode.js","webpack:///./cartridges/app_designholding/cartridge/client/default/js/utilities/validation/regex/house-number.js","webpack:///./cartridges/app_designholding/cartridge/client/default/js/utilities/validation/regex/house-number-addition.js","webpack:///./cartridges/app_designholding/cartridge/client/default/js/utilities/validation/regex/names.js","webpack:///./cartridges/app_designholding/cartridge/client/default/js/utilities/validation/regex/cd.js","webpack:///./cartridges/app_designholding/cartridge/client/default/js/utilities/validation/regex/pec.js","webpack:///./cartridges/app_designholding/cartridge/client/default/js/utilities/validation/regex/address.js","webpack:///./cartridges/app_designholding/cartridge/client/default/js/utilities/validation/regex/index.js","webpack:///./node_modules/lodash/_Symbol.js","webpack:///./node_modules/lodash/_baseGetTag.js","webpack:///./node_modules/lodash/_baseTrim.js","webpack:///./node_modules/lodash/_freeGlobal.js","webpack:///./node_modules/lodash/_getRawTag.js","webpack:///./node_modules/lodash/_objectToString.js","webpack:///./node_modules/lodash/_root.js","webpack:///./node_modules/lodash/_trimmedEndIndex.js","webpack:///./node_modules/lodash/debounce.js","webpack:///./node_modules/lodash/isObject.js","webpack:///./node_modules/lodash/isObjectLike.js","webpack:///./node_modules/lodash/isSymbol.js","webpack:///./node_modules/lodash/now.js","webpack:///./node_modules/lodash/toNumber.js","webpack:///./node_modules/validate.js/validate.js","webpack:///(webpack)/buildin/amd-define.js","webpack:///(webpack)/buildin/module.js"],"names":["SUCCESS_CLASS","SUCCESS_TIMER","ButtonLoader","constructor","element","shouldAnimate","show","classList","add","remove","setAttribute","Events","$trigger","data","target","hide","showSucces","removeAttribute","focus","setTimeout","signinConstraints","customValidationMessages","loginEmail","presence","allowEmpty","email","loginPassword","JS_HOOK_SIGNIN_ALERT","SigninForm","Form","messageSelector","initConstraints","bindChangeEvents","bindSubmitEvents","afterSubmitFormSuccess","window","_etmc","push","constraints","JS_HOOK_MESSAGE","JS_HOOK_CONTENT","addAlertMessage","message","hook","type","scroll","selector","status","el","document","querySelector","content","innerHTML","variantClass","className","replace","contains","offset","createMessageString","errors","errorHtml","forEach","error","apiErrorHandler","redirectUrl","location","href","serverErrors","length","errorMessage","responseJSON","errorHandler","response","Error","serializeObject","form","elements","serialized","i","field","name","disabled","checked","value","dateNL","options","day","month","year","split","m","parseInt","d","y","date","Date","validDate","getFullYear","getMonth","getDate","hasHouseNumber","hasNumber","test","houseNumber","validHouseNumber","regex","houseNumberRegex","slice","match","houseNumberAndAddition","validHouseAndAddition","houseNumberAdditionRegex","isEighteen","is18OrOlder","JS_HOOK_EMAIL_EXISTS_MSG","JS_HOOK_NEW_CUSTOMER_MSG","HIDDEN_CLASS","emailExists","key","validate","Promise","resolve","formItem","fieldset","closest","emailExistsMsg","newCustomerMsg","showEmailExistsMsg","showNewCustomerMsg","checkEmailExistsSuccess","exists","params","API","post","endpoint","then","catch","minAge","birthDate","age","singleAsyncValidator","async","single","newOptions","extend","format","fullMessages","giftConstraints","dwfrm_gift_firstName","dwfrm_gift_lastName","dwfrm_gift_giftMessage","dwfrm_gift_email","JS_HOOK_DEFAULT_SUBMIT","ALERT_SELECTOR","FORM_SELECTOR","INPUT_TYPES","FORM_ITEM_CLASS","FORM_ITEM_WARN_CLASS","FORM_ITEM_ERROR_CLASS","FORM_ITEM_ERROR_ARIA","FORM_ITEM_DESCRIBE_ARIA","FORM_ITEM_SUCCESS_CLASS","FORM_ITEM_ERROR_MESSAGE_HOOK","REGEX_REMOVE_NEWLINES_AND_WHITESPACE","Component","store","getAttribute","gtmObj","dataset","formSelector","class","inputTypes","warnClass","errorClass","errorAria","describeAria","successClass","defaultValidators","getDefaultValidators","getCustomValidationMessages","customConstraints","buttonLoaders","defaultSubmit","initInputs","init","bindEvents","setInitialValidators","debounceSingleFieldValidation","debounce","input","singleFieldValidation","changeListener","keyupListener","inputs","querySelectorAll","updateInputs","$on","obj","_constraints","initButtonLoaders","addButtonLoader","hideButtonLoaders","loader","getButtonElement","tagName","toLowerCase","parseDefaults","defaults","parseJSON","Object","keys","validators","customValidators","processServerErrors","fieldErrors","showErrors","submitFormSuccess","afterSubmitFormError","JSON","parse","submitFormError","simpleAfterSubmitFormError","preSubmitForm","submitForm","serializeForm","validateFormSuccess","event","currentTarget","validateFormError","validateForm","preventDefault","errorKeys","isAnyError","some","fatalError","getErrorData","validateSingle","custom","inputValue","id","preValidateFields","validateFields","filter","items","collectFormValues","actualConstraints","item","singleFieldValidationSuccess","showSuccessForInput","singleFieldValidationError","showErrorsForInput","numberFieldContainsText","scrolledToError","offsetParent","getErrorContainer","hasAttribute","formItemErrorContainer","resetFormItem","warning","textContent","labelContent","trim","errorId","addEventListener","map","eventName","keyCode","getErrorMessage","errorData","errorList","Array","find","warn","json","defaultValue","parsed","e","props","watch","watchCollection","stateChanged","Store","subscribe","state","prevState","prop","callback","newState","previousPropState","newPropState","isArray","undefined","actions","mutations","callbacks","self","Proxy","initialState","set","processCallbacks","console","String","dispatch","actionKey","payload","dispatchWithPromise","reject","_state","_prevState","cb","commit","mutationKey","assign","onlyWords","password","ean","emailRegex","phoneRegex","zipCodeRegex","zipCodeRegexStreetOptional","houseNumberAddition","names","cd","pec","addressRegex","dateNLRegex","eanRegex","onlyWordsRegex","passwordRegex","zipCode","cdRegex","pecRegex"],"mappings":"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AY;AACnC,UAAU,mBAAO,CAAC,2CAAO;AACzB,eAAe,mBAAO,CAAC,qDAAY;;AAEnC;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;AACA,WAAW,SAAS;AACpB,WAAW,OAAO;AAClB,WAAW,OAAO,YAAY;AAC9B,WAAW,QAAQ;AACnB;AACA,WAAW,OAAO;AAClB;AACA,WAAW,QAAQ;AACnB;AACA,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,8CAA8C,kBAAkB;AAChE;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;;;;;;;;;;;;;AC9LA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,EAAE;AACb,aAAa,QAAQ;AACrB;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,EAAE;AACb,aAAa,QAAQ;AACrB;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;;AC5BA,iBAAiB,mBAAO,CAAC,2DAAe;AACxC,mBAAmB,mBAAO,CAAC,6DAAgB;;AAE3C;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,EAAE;AACb,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;;AC5BA,WAAW,mBAAO,CAAC,+CAAS;;AAE5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;;ACtBA,eAAe,mBAAO,CAAC,uDAAa;AACpC,eAAe,mBAAO,CAAC,qDAAY;AACnC,eAAe,mBAAO,CAAC,qDAAY;;AAEnC;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,EAAE;AACb,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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;;;AC/DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;;AAEzB;AACA;AACA;;AAEA,kCAAkC,6BAA6B,EAAE;AACjE;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,MAAM,GAAG,MAAM,GAAG,MAAM;AAC1D;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,aAAa,4DAA4D;AACzE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,kDAAkD,KAAK,IAAI,oBAAoB;AAC/E;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,WAAW;AACX;AACA;;AAEA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,OAAO;AACP,mDAAmD,OAAO;AAC1D;;AAEA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,2BAA2B;;AAE3B;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,SAAS;AACT;AACA,SAAS;AACT,OAAO;AACP,KAAK;;AAEL;AACA,2BAA2B;AAC3B;AACA;AACA,OAAO;AACP,gBAAgB,cAAc,GAAG,oBAAoB;AACrD,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW;AACX,SAAS;AACT,OAAO,6BAA6B,KAAK,EAAE,GAAG;AAC9C,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,KAAK;;AAEL;AACA;AACA,sBAAsB,IAAI,IAAI,WAAW;AACzC;AACA,8BAA8B,IAAI;AAClC,2CAA2C,IAAI;AAC/C,mBAAmB,IAAI;AACvB;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,WAAW;AAC/B,SAAS;AACT;AACA;AACA,OAAO;AACP,KAAK;AACL,iBAAiB,IAAI;AACrB,6BAA6B,KAAK,KAAK;AACvC,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;;AAEA;AACA,oCAAoC,sBAAsB,EAAE;AAC5D;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,KAAK;;AAEL;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA,KAAK;;AAEL;AACA,eAAe;AACf,KAAK;;AAEL;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP,KAAK;;AAEL;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,iBAAiB,oBAAoB;AACrC;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,KAAK;;AAEL;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAO;AACP,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA,iBAAiB,mBAAmB;AACpC;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,iBAAiB,mBAAmB;AACpC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;;AAEA;AACA,KAAK;;AAEL;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA,OAAO;AACP,KAAK;;AAEL;AACA,SAAS,6BAA6B;AACtC;AACA,SAAS,mBAAmB,GAAG,mBAAmB;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,UAAU,WAAW;AACrD,WAAW;AACX,SAAS;AACT;AACA;AACA,OAAO;AACP;AACA,KAAK;;AAEL;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,4BAA4B,cAAc,aAAa;AACvD,OAAO;AACP;AACA,KAAK;;AAEL;AACA,SAAS,kCAAkC;AAC3C;AACA,QAAQ,qBAAqB,kCAAkC;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,OAAO;AACP;AACA,KAAK;;AAEL;AACA,SAAS,0BAA0B,GAAG,0BAA0B;AAChE;AACA;AACA;AACA;AACA,8BAA8B,oBAAoB,EAAE;AACpD;AACA;AACA,SAAS;AACT,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,2CAA2C;AAC3C;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,6BAA6B;AAC7B;AACA;;AAEA;AACA;;AAEA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,kCAAkC,iBAAiB,EAAE;AACrD;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,2BAA2B;AAC3B;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;;AAEA,2BAA2B;;AAE3B;AACA;AACA;AACA,0DAA0D,YAAY;AACtE;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,4CAA4C,MAAM;AAClD,mCAAmC,UAAU;AAC7C;;AAEA;AACA;AACA;AACA,sCAAsC,MAAM;AAC5C,mCAAmC,eAAe;AAClD;;AAEA;AACA;AACA;AACA,qCAAqC,MAAM;AAC3C,mCAAmC,eAAe;AAClD;;AAEA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;;AAEA,2BAA2B;;AAE3B;AACA;AACA;AACA;AACA,kDAAkD,cAAc,EAAE;AAClE,kDAAkD,eAAe,EAAE;AACnE,kDAAkD,gBAAgB,EAAE;AACpE,kDAAkD,cAAc,EAAE;AAClE,kDAAkD,eAAe,EAAE;AACnE,kDAAkD,oBAAoB;AACtE;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;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;AACA;AACA;AACA;AACA,uBAAuB,KAAK,GAAG,MAAM;;AAErC;AACA;AACA;AACA,WAAW;AACX;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,2BAA2B;;AAE3B;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,oBAAoB;AAClD;;AAEA;AACA;AACA;AACA;AACA,qCAAqC,KAAK;AAC1C;AACA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA;AACA,mCAAmC,KAAK;AACxC;AACA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA,2BAA2B,YAAY,eAAe;AACtD;AACA,KAAK;AACL;AACA;AACA,mBAAmB;AACnB;;AAEA,2BAA2B;;AAE3B;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA,2BAA2B;AAC3B;AACA;AACA;AACA;AACA;AACA,YAAY,MAAM;AAClB,gCAAgC,aAAa;AAC7C,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA,2BAA2B;AAC3B;AACA;AACA;AACA,2DAA2D,MAAM;AACjE;AACA;AACA;AACA,gCAAgC,aAAa;AAC7C,KAAK;AACL;AACA,2BAA2B;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,0CAA0C,EAAE,+BAA+B,EAAE,2NAA2N,EAAE;AAC1S,KAAK;AACL;AACA;AACA;AACA;;AAEA;AACA,mBAAmB;AACnB;AACA,2BAA2B;AAC3B;AACA;AACA,2BAA2B,UAAU;;AAErC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,kCAAkC,uCAAuC;AACzE;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;;AAEA,2BAA2B;;AAE3B;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,+CAA+C,GAAG;;AAElD;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,kCAAkC,IAAI,EAAE,EAAE;AAC1C,+CAA+C,IAAI,EAAE,EAAE;AACvD,oDAAoD,IAAI,EAAE,EAAE;AAC5D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,IAAI,qBAAqB,EAAE;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,IAAI;AACrB;AACA;AACA;;AAEA;AACA;AACA,6CAA6C;AAC7C,6CAA6C;AAC7C,kDAAkD;AAClD;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,2BAA2B;AAC3B;;AAEA;AACA;AACA;;AAEA,+BAA+B;;AAE/B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,mFAAmF,KAAK;;AAExF;AACA;AACA;;AAEA,kCAAkC,6CAA6C;AAC/E;AACA,KAAK;AACL;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,KAAK;AACL;;AAEA;AACA,gCAAgC,eAAe;AAC/C;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;;AAEA,yDAAyD,8FAAM;AAC/D,CAAC;AACD,QAAQ,KAA8B,wCAAwC,SAAI;AAClF,QAAQ,KAA6B,uCAAuC,SAAI;AAChF,QAAQ,8FAAwE;;;;;;;;;;;;;;ACpuChF;AACA;AACA;;;;;;;;;;;;;ACFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA","file":"js/SigninForm.js","sourcesContent":["import Events from '@utilities/events';\n\nconst SUCCESS_CLASS = 'is--success';\nconst SUCCESS_TIMER = 3000;\n\nclass ButtonLoader {\n constructor(element, shouldAnimate = true) {\n this.element = element;\n this.shouldAnimate = shouldAnimate;\n }\n\n /**\n * Shows the loader\n */\n show() {\n if (!this.element) return;\n this.element.classList.add('disabled');\n this.element.classList.remove(SUCCESS_CLASS);\n this.element.setAttribute('disabled', 'disabled');\n this.element.setAttribute('tabindex', '-1');\n if (this.shouldAnimate) Events.$trigger('loader::show', { data: { target: this.element } });\n }\n\n /**\n * Hides the loader\n */\n hide(showSucces = false) {\n if (!this.element) return;\n if (this.shouldAnimate) Events.$trigger('loader::hide');\n this.element.classList.remove('disabled');\n this.element.removeAttribute('disabled');\n this.element.removeAttribute('tabindex');\n if (this.shouldAnimate) this.element.focus();\n\n if (showSucces) {\n this.element.classList.add(SUCCESS_CLASS);\n setTimeout(() => {\n this.element.classList.remove(SUCCESS_CLASS);\n }, SUCCESS_TIMER);\n }\n }\n}\n\nexport default ButtonLoader;\n","import ButtonLoader from './button-loader'\n\nexport default ButtonLoader\n","const signinConstraints = (customValidationMessages) => ({\n loginEmail: {\n ...customValidationMessages.loginEmail,\n presence: {\n allowEmpty: false,\n },\n email: true,\n },\n loginPassword: {\n ...customValidationMessages.loginPassword,\n presence: {\n allowEmpty: false,\n },\n },\n})\n\nexport default signinConstraints\n","import Form from '@utilities/form';\nimport signinConstraints from './signin-constraints';\n\nconst JS_HOOK_SIGNIN_ALERT = '[js-hook-signin-alert]';\n\n/**\n * Used to handle signin requests from user\n *\n * @class SigninForm\n * @extends {Form}\n */\nclass SigninForm extends Form {\n constructor(element) {\n super(element);\n\n this.messageSelector = JS_HOOK_SIGNIN_ALERT;\n\n // Init constraints\n this.initConstraints();\n\n // Events: Submit & Change Events\n this.bindChangeEvents();\n this.bindSubmitEvents();\n }\n\n // eslint-disable-next-line class-methods-use-this\n afterSubmitFormSuccess(data) {\n if (data.email && window._etmc) {\n window._etmc.push(['setUserInfo', { email: data.email }]);\n }\n }\n\n /**\n * Init constraints for form validation for validate.js\n */\n initConstraints() {\n this.constraints = signinConstraints(this.customValidationMessages);\n }\n}\n\nexport default SigninForm;\n","import SigninForm from './signin-form'\n\nexport default SigninForm\n","import Events from '@utilities/events'\n\nconst JS_HOOK_MESSAGE = '[js-hook-message]'\nconst JS_HOOK_CONTENT = '[js-hook-alert-content]'\n\n/**\n * Add alert message to page\n *\n * @param {String} message - the message string to show\n * @param {String} hook - [js-hook-message] or custom hook\n * @param {String} type - success, warning or error type\n */\nconst addAlertMessage = function ({ message, hook, type, scroll = false }) {\n const selector = hook || JS_HOOK_MESSAGE\n const status = type || 'error'\n\n const el = document.querySelector(selector)\n\n if (!el) return\n const content = el.querySelector(JS_HOOK_CONTENT)\n content.innerHTML = message\n\n // Add classes and show\n const variantClass = `alert--${status}`;\n el.className = el.className.replace(/(?:^|\\W)alert--(\\w+)(?!\\w)/g, ` ${variantClass}`)\n if(!el.classList.contains(variantClass)) el.classList.add(variantClass)\n el.classList.remove('u-hidden')\n el.removeAttribute('aria-hidden')\n el.focus()\n\n // Scroll to alert\n if (!el.classList.contains('is--relative') && !scroll) return\n Events.$trigger('scroll-to::scroll', {\n data: {\n target: el,\n offset: 130,\n },\n })\n}\nexport default addAlertMessage\n","import addAlertMessage from './add-alert-message'\n\nexport default addAlertMessage\n","const createMessageString = function (errors) {\n let errorHtml = ''\n errors.forEach((error) => {\n errorHtml += `<p>${error}</p>`\n })\n return errorHtml\n}\nexport default createMessageString\n","import createMessageString from './create-message-string'\n\nexport default createMessageString\n","import createMessageString from '@utilities/errors/create-message-string'\nimport addAlertMessage from '../add-alert-message'\n\n/**\n * Process API error\n *\n * @param {Object|String} error - error message\n * @param {string} selector - error message selector\n */\nconst apiErrorHandler = function (error, selector) {\n if (!error) return\n const { redirectUrl } = error\n if (redirectUrl) {\n window.location.href = redirectUrl\n } else if (error.serverErrors && error.serverErrors.length) {\n addAlertMessage({\n message: createMessageString(error.serverErrors),\n hook: selector,\n type: 'error',\n scroll: 'true'\n })\n } else {\n const errorMessage = error.errorMessage || error.message || error.responseJSON\n if (!errorMessage) return\n addAlertMessage({ message: errorMessage, hook: selector, type: 'error', scroll: 'true' })\n }\n}\n\nexport default apiErrorHandler\n","import apiErrorHandler from './api-error-handler'\n\nexport default apiErrorHandler\n","import idx from 'idx'\nimport Events from '@utilities/events'\nimport apiErrorHandler from '../api-error-handler'\n\n/**\n * Process errors from API or JS errors\n *\n * @param {Object} error - error message\n */\nconst errorHandler = function (error) {\n Events.$trigger('loader::hide')\n const data = idx(error, (_) => _.response.data)\n if (data) {\n apiErrorHandler(data)\n } else {\n throw new Error(`JAVASCRIPT ERROR: ${error}`)\n }\n}\n\nexport default errorHandler\n","import errorHandler from './error-handler'\n\nexport default errorHandler\n","/**\n * Serialize all form data into an Object\n * @param {Node} form The form to serialize\n * @return {Object} The serialized form obbject\n */\nconst serializeObject = function (form) {\n if (!form || !form.elements) return ''\n\n // Setup our serialized data\n const serialized = {}\n\n // Loop through each field in the form\n for (let i = 0; i < form.elements.length; i++) {\n const field = form.elements[i]\n\n // Don't serialize fields without a name, submits, buttons, file and reset inputs, and disabled fields\n if (\n !field.name ||\n field.disabled ||\n field.type === 'file' ||\n field.type === 'reset' ||\n field.type === 'submit' ||\n field.type === 'button'\n ) {\n /* eslint-disable-next-line */\n continue\n }\n\n // Convert field data to a query string\n if ((field.type !== 'checkbox' && field.type !== 'radio') || field.checked) {\n serialized[field.name] = field.value\n }\n }\n\n return serialized\n}\nexport default serializeObject\n","import serializeObject from './serialize-object'\n\nexport default serializeObject\n","/**\n * Check if a date is valid\n * @param {String} value | input value\n * @param {Object} options\n * @returns {String|null} returns null which validates as true in validate.js or an error string\n */\nconst dateNL = function (value, options) {\n if (!value) return null\n const [day, month, year] = value.split('-')\n // This instruction will create a date object\n const m = parseInt(month, 10) - 1\n const d = parseInt(day, 10)\n const y = parseInt(year, 10)\n const date = new Date(y, m, d)\n const validDate = date.getFullYear() === y && date.getMonth() === m && date.getDate() === d\n if (day && month && year && !validDate) {\n return options.message\n }\n return null\n}\nexport default dateNL\n","/**\n * Custom validator for valid house number\n * @param {String} value | input value\n * @param {Object} options\n * @returns {String|null} returns null which validates as true in validate.js or an error string\n */\nconst hasHouseNumber = function (value, options) {\n const hasNumber = /\\d+/.test(value)\n if (!hasNumber) {\n return options\n }\n return null\n}\nexport default hasHouseNumber\n","import regex from '../regex'\n\n/**\n * Custom validator for valid house number\n * @param {String} value | input value\n * @param {Object} options\n * @returns {String|null} returns null which validates as true in validate.js or an error string\n */\nconst houseNumber = function (value, options) {\n const validHouseNumber =\n value &&\n regex.houseNumberRegex.test(value) &&\n value.length <= 10 &&\n !value.slice(-1).match(/[a-zA-Z]/i)\n if (!validHouseNumber) {\n return options.message\n }\n return null\n}\nexport default houseNumber\n","import regex from '../regex'\n\n/**\n * Custom validator for valid house number + addition\n * @param {String} value | input value\n * @param {Object} options\n * @returns {String|null} returns null which validates as true in validate.js or an error string\n */\nconst houseNumberAndAddition = function (value, options) {\n const validHouseAndAddition =\n value &&\n regex.houseNumberRegex.test(value) &&\n value.length <= 10 &&\n !regex.houseNumberAdditionRegex.test(value)\n if (!validHouseAndAddition) {\n return options.message\n }\n return null\n}\nexport default houseNumberAndAddition\n","/**\n * Check if person is 18 years or older\n * @param {String} value | input value\n * @param {Object} options\n * @returns {String|null} returns null which validates as true in validate.js or an error string\n */\nconst isEighteen = function (value, options) {\n if (!value) return null\n const [day, month, year] = value.split('-')\n const is18OrOlder =\n new Date(parseInt(year, 10) + 18, parseInt(month, 10) - 1, parseInt(day, 10)) <= new Date()\n if (day && month && year && !is18OrOlder) {\n return options.message\n }\n return null\n}\nexport default isEighteen\n","import validate from 'validate.js'\nimport API from 'storefront/utilities/api'\n\nconst JS_HOOK_EMAIL_EXISTS_MSG = '[js-hook-order-account-email-exists]'\nconst JS_HOOK_NEW_CUSTOMER_MSG = '[js-hook-order-account-new-customer]'\nconst HIDDEN_CLASS = 'u-hidden'\n\n/**\n * Custom validator to check if email exists\n * @param {String} value | input value\n * @param {Object} options\n * @returns {Promise} returns resolved promise with message\n */\nconst emailExists = function (value, options, key) {\n return new validate.Promise((resolve) => {\n const formItem = document.querySelector(`[name$='${key}']`)\n const fieldset = formItem.closest('fieldset')\n // const emailMessages = fieldset.querySelector(JS_HOOK_EMAIL_MESSAGES);\n const emailExistsMsg = fieldset.querySelector(JS_HOOK_EMAIL_EXISTS_MSG)\n const newCustomerMsg = fieldset.querySelector(JS_HOOK_NEW_CUSTOMER_MSG)\n // if (!value) resolve();\n\n function showEmailExistsMsg() {\n emailExistsMsg.classList.remove(HIDDEN_CLASS)\n newCustomerMsg.classList.add(HIDDEN_CLASS)\n }\n\n function showNewCustomerMsg() {\n newCustomerMsg.classList.remove(HIDDEN_CLASS)\n emailExistsMsg.classList.add(HIDDEN_CLASS)\n }\n\n function checkEmailExistsSuccess(data) {\n if (data && data.exists) {\n showEmailExistsMsg()\n } else {\n showNewCustomerMsg()\n }\n resolve()\n }\n\n const params = {\n email: value,\n }\n\n API.post(options.endpoint, params)\n .then((response) => checkEmailExistsSuccess(response.data))\n .catch(() => resolve())\n })\n}\nexport default emailExists\n","/**\n * Check if birth date exceeds the minimum to prevent unrealistic birth dates\n * @param {String} value - input value: date (format: 01-02-1993)\n * @param {Object} options - message - feedback message\n * @returns {String|null} returns null which validates as true in validate.js or an error string\n */\nconst minAge = function (value, options) {\n if (!value || !options.message) return null\n\n const [day, month, year] = value.split('-')\n\n if (!day || !month || !year) return null\n\n const birthDate = new Date(+year, month - 1, +day)\n const age = new Date() - birthDate\n\n // Check if age is older dan 120 years\n if (!birthDate || age > 120 * 365 * 24 * 60 * 60 * 1000) return options.message\n\n return null\n}\n\nexport default minAge\n","/**\n * Custom validator for valid checkbox\n * @param {String} value | input checked\n * @param {Object} options\n * @returns {String|null} returns null which validates as true in validate.js or an error string\n */\nconst checked = function (value, options) {\n const message = options && options.message ? options.message : this.options.message\n if (value !== true) {\n return message\n }\n return null\n}\n\nexport default checked\n","/**\n * Custom validators\n */\nimport dateNL from './date-nl'\nimport hasHouseNumber from './has-house-number'\nimport houseNumber from './house-number'\nimport houseNumberAndAddition from './house-number-addition'\nimport isEighteen from './is-eighteen'\nimport emailExists from './email-exists'\nimport minAge from './min-age'\nimport checked from './checked'\n\nexport default {\n dateNL,\n emailExists,\n houseNumberAndAddition,\n houseNumber,\n hasHouseNumber,\n isEighteen,\n minAge,\n checked,\n}\n","import validate from 'validate.js'\n\n/**\n * Add an async single validate function to ValidateJS\n * Extend ValidateJS core functionality\n */\nconst singleAsyncValidator = () => {\n validate.async.single = function (value, constraints, options) {\n const key = options.key || 'single'\n const newOptions = validate.extend({}, validate.single.options, options, {\n format: 'flat',\n fullMessages: false,\n })\n return validate.async({ [key]: value }, { [key]: constraints }, newOptions)\n }\n}\nexport default singleAsyncValidator\n","const giftConstraints = function () {\n\n const constraints = {\n dwfrm_gift_firstName: {\n presence: {\n allowEmpty: false,\n },\n },\n\n dwfrm_gift_lastName: {\n presence: {\n allowEmpty: false,\n },\n },\n\n dwfrm_gift_giftMessage: {\n presence: {\n allowEmpty: false,\n },\n },\n\n dwfrm_gift_email: {\n presence: {\n allowEmpty: false,\n },\n email: true,\n }\n }\n\n return constraints;\n};\n\nexport default giftConstraints;\n","import validate from 'validate.js';\nimport debounce from 'lodash/debounce';\nimport API from '@utilities/api';\nimport parseJSON from '@utilities/parse-json';\nimport serializeObject from '@utilities/serialize-object';\nimport Events from '@utilities/events';\nimport errorHandler from '@utilities/errors/error-handler';\nimport customValidators from '@utilities/validation/validators';\nimport ButtonLoader from '@components/button-loader';\nimport apiErrorHandler from '@utilities/errors/api-error-handler';\nimport singleAsyncValidator from '@utilities/validation/helpers/single-async-validator';\nimport Component from '@utilities/store/lib/component';\nimport giftConstraints from '../../components/shipping-form/gift-constraints';\n\nconst JS_HOOK_DEFAULT_SUBMIT = '[type=\"submit\"]:not(.u-sr-only)';\nconst ALERT_SELECTOR = '[js-hook-message]';\nconst FORM_SELECTOR = '.c-form';\nconst INPUT_TYPES =\n 'input[name]:not(:disabled):not([type=\"hidden\"]):not([data-ignored]), textarea[name]:not([data-ignored]), select[name]:not([data-ignored])';\nconst FORM_ITEM_CLASS = '.form__item';\nconst FORM_ITEM_WARN_CLASS = 'form__item--warn';\nconst FORM_ITEM_ERROR_CLASS = 'form__item--error';\nconst FORM_ITEM_ERROR_ARIA = 'aria-invalid';\nconst FORM_ITEM_DESCRIBE_ARIA = 'aria-describedby';\nconst FORM_ITEM_SUCCESS_CLASS = 'form__item--success';\nconst FORM_ITEM_ERROR_MESSAGE_HOOK = '.form__item-error:not([data-ignored])';\nconst REGEX_REMOVE_NEWLINES_AND_WHITESPACE = /[\\n\\r]+|[\\s]{2,}/g;\n\nclass Form extends Component {\n constructor(element, store) {\n super({ store, element });\n\n this.form = element;\n this.endpoint = element.getAttribute('action');\n this.gtmObj = element.dataset.gtmObj;\n\n this.messageSelector = ALERT_SELECTOR;\n this.formSelector = FORM_SELECTOR;\n\n this.class = FORM_ITEM_CLASS;\n this.inputTypes = INPUT_TYPES;\n this.warnClass = FORM_ITEM_WARN_CLASS;\n this.errorClass = FORM_ITEM_ERROR_CLASS;\n this.errorAria = FORM_ITEM_ERROR_ARIA;\n this.describeAria = FORM_ITEM_DESCRIBE_ARIA;\n this.successClass = FORM_ITEM_SUCCESS_CLASS;\n this.message = FORM_ITEM_ERROR_MESSAGE_HOOK;\n\n // Constraints & Validation\n this.defaultValidators = this.getDefaultValidators();\n this.customValidationMessages = this.getCustomValidationMessages();\n this.constraints = {};\n this.customConstraints = {};\n\n // Buttons\n this.buttonLoaders = [];\n this.defaultSubmit = this.form.querySelector(JS_HOOK_DEFAULT_SUBMIT);\n\n this.initInputs();\n this.init();\n this.bindEvents();\n }\n\n init() {\n // Validators\n this.setInitialValidators();\n singleAsyncValidator();\n\n // Events\n const debounceSingleFieldValidation = debounce(\n (input) => this.singleFieldValidation(input),\n 800,\n );\n this.changeListener = (input) => debounceSingleFieldValidation(input);\n this.keyupListener = (input) => this.singleFieldValidation(input);\n }\n\n initInputs() {\n this.inputs = [...this.form.querySelectorAll(this.inputTypes)];\n }\n\n updateInputs() {\n this.initInputs();\n this.bindChangeEvents();\n }\n\n bindEvents() {\n Events.$on('form::update-inputs', () => this.updateInputs());\n }\n\n set constraints(obj) {\n this._constraints = obj;\n }\n\n get constraints() {\n return this._constraints;\n }\n\n initButtonLoaders() {\n if (this.defaultSubmit) {\n this.addButtonLoader(this.defaultSubmit, false);\n }\n }\n\n hideButtonLoaders() {\n this.buttonLoaders.forEach((loader) => loader.hide());\n this.buttonLoaders = [];\n }\n\n /**\n * Changes the button loader\n * @param {HTMLElement} element - DOM element of the button\n * @param {Boolean} shouldAnimate - button should animate with a loader element\n */\n addButtonLoader(element, shouldAnimate) {\n if (!element) return;\n this.buttonLoaders.push(new ButtonLoader(element, shouldAnimate));\n this.buttonLoaders[this.buttonLoaders.length - 1].show();\n }\n\n getButtonElement(target) {\n if (!target) return null;\n if (target.tagName.toLowerCase() === 'form') {\n return this.form.querySelector('[type=\"submit\"]');\n }\n if (target.tagName.toLowerCase() === 'button') {\n return target;\n }\n return null;\n }\n\n getDefaultValidators() {\n const { data, error } = Form.parseDefaults(this.form.dataset.defaultValidators);\n if (error) return new Error(`Form.js - getDefaultValidators - Error: ${error}`);\n return data;\n }\n\n getCustomValidationMessages() {\n const { data, error } = Form.parseDefaults(this.form.dataset.customValidationMessages);\n if (error) return new Error(`Form.js - getCustomValidationMessages - Error: ${error}`);\n return data;\n }\n\n /**\n * Parse an object containing defaults\n * @param {Object} defaults - defaults object\n */\n static parseDefaults(defaults) {\n const data = parseJSON(defaults, {});\n if (!data)\n return {\n error: \"Couldn't parse defaults in Form.js - function parseDefaults\",\n };\n return { data };\n }\n\n /**\n * Set initial validators on ValidateJS.\n * Add defaultValidator messages & custom validators for ean, zipcode etc\n */\n setInitialValidators() {\n if (!this.defaultValidators) return;\n\n // Init Default Validators\n Object.keys(this.defaultValidators).forEach((key) => {\n validate.validators[key].options = this.defaultValidators[key];\n });\n\n // Init Custom Validators\n Object.keys(customValidators).forEach((key) => {\n validate.validators[key] = customValidators[key];\n });\n }\n\n /**\n * Shows errors from backend/server in form per field or on top of form when it is a generic server error\n * @param {Object} data - the response data\n */\n processServerErrors(data) {\n if (data.fieldErrors?.length) {\n data.fieldErrors.forEach((error) => {\n if (Object.keys(error).length) {\n this.showErrors(error);\n }\n });\n }\n\n if (data.serverErrors?.length || data.errorMessage?.length) {\n apiErrorHandler(data, this.messageSelector);\n }\n }\n\n /**\n * Submit form success handler\n * @param {Object} data - data returned from API call\n */\n submitFormSuccess(data) {\n if (data.error) {\n if (typeof this.afterSubmitFormError === 'function') {\n this.afterSubmitFormError(data);\n } else {\n this.processServerErrors(data);\n }\n }\n // If extended form provides afterSubmitFormSuccess function, this will be called\n else if (typeof this.afterSubmitFormSuccess === 'function') {\n this.afterSubmitFormSuccess(data);\n }\n\n if (this.gtmObj) {\n Events.$trigger('gtm::push', {\n data: JSON.parse(this.gtmObj),\n });\n }\n\n if (data.redirectUrl) {\n window.location.href = data.redirectUrl;\n } else {\n this.hideButtonLoaders();\n }\n }\n\n submitFormError(error) {\n this.hideButtonLoaders();\n\n // If extended form provides simpleAfterSubmitFormError function, this will be called\n if (typeof this.simpleAfterSubmitFormError === 'function') {\n this.simpleAfterSubmitFormError();\n }\n\n errorHandler(error);\n }\n\n /**\n * Post form to API\n */\n preSubmitForm() {\n this.submitForm(this.serializeForm());\n }\n\n serializeForm() {\n return serializeObject(this.form);\n }\n\n submitForm(data) {\n API.post(this.endpoint, data)\n .then((response) => this.submitFormSuccess(response.data))\n .catch((error) => this.submitFormError(error));\n }\n\n /**\n * Form validation success handler\n *\n * @param event, submit event\n */\n validateFormSuccess(event) {\n if (event) {\n const target = this.getButtonElement(event.currentTarget);\n this.addButtonLoader(target, true);\n }\n this.preSubmitForm();\n }\n\n /**\n * Form validation error handler\n *\n * @param {Array} errors | errors returned from ValidateJS\n */\n validateFormError(errors) {\n if (errors instanceof Error) {\n // This means an exception was thrown from a validator\n apiErrorHandler(errors, this.messageSelector);\n } else {\n this.showErrors(errors);\n }\n }\n\n /**\n * Submit the shipping form\n * @param event, submit event\n */\n validateForm(event = null) {\n if (event) event.preventDefault();\n\n this.validate()\n .then(\n () => this.validateFormSuccess(event),\n (errors) => {\n const errorKeys = Object.keys(errors);\n\n // if there are errors without warning, fail validation\n const isAnyError = errorKeys.some((key) => {\n const { fatalError } = getErrorData(errors[key]);\n return fatalError;\n });\n\n if (isAnyError) {\n this.validateFormError(errors);\n return;\n }\n this.validateFormSuccess(event);\n },\n )\n .catch((error) => errorHandler(error));\n }\n\n /**\n * Validate a single field\n *\n * @param {HTMLElement} input | input that fired onChange event\n * @returns {Promise}\n */\n validateSingle(input, custom) {\n let inputValue = input.value;\n if (input.type === 'checkbox') inputValue = input.checked;\n let constraints;\n\n if (input.id === 'dwfrm_gift_firstName' || input.id === 'dwfrm_gift_lastName' || input.id === 'dwfrm_gift_email') {\n constraints = giftConstraints();;\n } else {\n constraints = custom === false ? this.constraints : this.customConstraints;\n }\n\n return validate.async.single(inputValue, constraints[input.name], {\n key: input.name,\n });\n }\n\n /**\n * Prevalidate filled fields\n */\n preValidateFields() {\n this.validateFields(this.inputs.filter((input) => input.value.length > 0));\n }\n\n /**\n * Validate fields from an array\n *\n * @param {HTMLElement[]} inputs | inputs array\n */\n validateFields(inputs) {\n ;[...inputs].forEach((input) => this.singleFieldValidation(input));\n }\n\n /**\n * Validate the form\n *\n * @returns {Promise}\n */\n validate() {\n const items = validate.collectFormValues(this.form);\n\n // create new constraints object\n // based on non hidden input fields\n const actualConstraints = {};\n\n Object.keys(items).forEach((item) => {\n const key = item;\n if (!this.constraints[key]) return;\n actualConstraints[key] = this.constraints[key];\n });\n\n return validate.async(items, actualConstraints, { fullMessages: false });\n }\n\n /**\n * Single field validation success handler\n *\n * @param {HTMLElement} input | input that fired onChange event\n */\n singleFieldValidationSuccess(input) {\n this.showSuccessForInput(input);\n }\n\n /**\n * Single field validation error handler\n *\n * @param {HTMLElement} input | input that fired onChange event\n * @param {Array} errors | errors returned from ValidateJS\n */\n singleFieldValidationError(input, errors) {\n this.showErrorsForInput(input, errors);\n return errors;\n }\n\n /**\n * Single field validation:\n * Can be called as onChange event or to validate a single input\n * @param {HTMLElement} input | input that fired onChange event\n */\n singleFieldValidation(input, custom = false) {\n if (Form.numberFieldContainsText(input)) {\n input.value = '';\n }\n\n return this.validateSingle(input, custom)\n .then(\n () => this.singleFieldValidationSuccess(input),\n (errors) => this.singleFieldValidationError(input, errors),\n )\n .catch((error) => apiErrorHandler(error));\n }\n\n /**\n * Checks if input type=\"number\" fields contain text\n *\n * @param {HTMLElement} input | input element to check\n * @returns {Boolean} return true if number field contains text, false otherwise\n */\n static numberFieldContainsText(input) {\n if (input.getAttribute('type') === 'number') {\n return !/^\\d+$/.test(input.value);\n }\n\n return false;\n }\n\n /**\n * Gather validation errors and show per input\n *\n * @param {Array} errors | errors returned from ValidateJS\n */\n showErrors(errors) {\n if (!errors) return;\n // const formItems = this.form.querySelectorAll(this.inputTypes)\n\n let scrolledToError = false;\n ;[...this.inputs].forEach((input) => {\n if (!scrolledToError && errors[input.name]) {\n const { fatalError } = getErrorData(errors[input.name]);\n\n if (fatalError) {\n input.focus();\n Events.$trigger('scroll-to::scroll', {\n data: {\n target: input.offsetParent !== null ? input : input.closest(FORM_ITEM_CLASS),\n offset: 180,\n },\n });\n scrolledToError = true;\n }\n }\n this.showErrorsForInput(input, errors[input.name]);\n });\n }\n\n getErrorContainer(input) {\n if (input.name === 'brandCode') return false;\n const formItem = input.closest(this.class);\n\n return formItem?.querySelector(this.message);\n }\n\n /**\n * Display validation error on a specific field\n *\n * @param {HTMLElement} input | input to show error on\n * @param {Array} errors | errors returned from ValidateJS or Backend\n */\n showErrorsForInput(input, errors) {\n if (input.hasAttribute('data-ignored')) return; // Allows us to ignore certain inputs. https://validatejs.org/#utilities-collect-form-values doesn't seem to work.\n\n const formItem = input.closest(this.class);\n const formItemErrorContainer = this.getErrorContainer(input);\n\n if (!formItemErrorContainer) {\n return;\n }\n\n // reset form input state\n this.resetFormItem(formItem, input);\n if (errors) {\n const { warning, fatalError, errorMessage } = getErrorData(errors);\n input.setAttribute(this.errorAria, true);\n input.setAttribute(this.describeAria, formItemErrorContainer.id);\n formItem.classList.add(!fatalError && warning ? this.warnClass : this.errorClass);\n formItemErrorContainer.textContent = errorMessage;\n formItemErrorContainer.removeAttribute('aria-hidden');\n const labelContent =\n document\n .querySelector(`label[for=\"${input.id}\"]`)\n ?.textContent.replace(REGEX_REMOVE_NEWLINES_AND_WHITESPACE, ' ')\n .trim() || '';\n Events.$trigger('gtm::errorEvent', {\n data: {\n errorMessage,\n errorId: labelContent,\n },\n });\n } else if (input.value.length > 0) {\n formItem.classList.add(this.successClass);\n }\n }\n\n showSuccessForInput(input) {\n const formItem = input.closest(this.class);\n this.resetFormItem(formItem, input);\n\n if (input.value.length > 0) {\n formItem.classList.add(this.successClass);\n }\n }\n\n /**\n * Remove error classes and any old error message\n * @param {HTMLElement} formItem | input parent that holds error/success classes\n * @param {HTMLElement} input | input element\n */\n resetFormItem(formItem, input) {\n const formItemErrorContainer = this.getErrorContainer(input);\n input.removeAttribute(this.errorAria);\n input.removeAttribute(this.describeAria);\n\n if (formItemErrorContainer) {\n formItemErrorContainer.setAttribute('aria-hidden', 'true');\n formItemErrorContainer.textContent = '';\n }\n\n if (formItem) {\n formItem.classList.remove(this.errorClass);\n formItem.classList.remove(this.warnClass);\n formItem.classList.remove(this.successClass);\n }\n }\n\n bindSubmitEvents() {\n // TODO: For debug of forms, keep for now\n // this.form.addEventListener('submit', event => {\n // event.preventDefault(event);\n // this.submitForm();\n // });\n this.form.addEventListener('submit', (event) => this.validateForm(event));\n }\n\n /**\n * Bind change events of input elements\n */\n bindChangeEvents() {\n this.inputs.map((input) => {\n const eventName =\n input.tagName === 'SELECT' || input.type === 'checkbox' || input.type === 'radio'\n ? 'change'\n : 'keyup';\n input.addEventListener(eventName, (event) => {\n if (event.keyCode !== 9 && eventName === 'change') {\n this.changeListener(input);\n } else if (event.keyCode !== 9) {\n this.keyupListener(input);\n }\n });\n input.addEventListener('paste', () => this.changeListener(input));\n });\n this.hideButtonLoaders();\n }\n}\n\nfunction getErrorMessage(errorData) {\n if (errorData) {\n if (errorData.message) {\n return errorData.message;\n }\n return errorData;\n }\n return false;\n}\n\nfunction getErrorData(errors) {\n const errorList = errors.constructor === Array ? [...errors] : [errors];\n const fatalError = errorList.find((error) => !error.warn);\n const warning = errorList.find((error) => error.warn);\n\n return {\n fatalError,\n warning,\n errorMessage: getErrorMessage(fatalError || warning),\n };\n}\n\nexport default Form;\n","import Form from './form'\n\nexport default Form\n","const parseJSON = function (json, defaultValue) {\n // This function cannot be optimised, it's best to\n // keep it small!\n let parsed\n\n try {\n parsed = JSON.parse(json)\n } catch (e) {\n parsed = defaultValue\n }\n\n return parsed || null // Could be undefined!\n}\n\nexport default parseJSON\n","import parseJSON from './parse-json'\n\nexport default parseJSON\n","// @ts-ignore\nimport idx from 'idx'\n\nimport Store from '../store/store'\n\nclass Component {\n constructor(props = {}) {\n this.watch = Component.watch || function() {}\n this.watchCollection = Component.watchCollection || function() {}\n this.stateChanged = this.stateChanged || function() {}\n if (props.store instanceof Store) {\n // This fires every time the state updates\n props.store.subscribe((state, prevState) => {\n this.stateChanged(state, prevState)\n })\n }\n\n if (props.element) {\n this.element = props.element\n }\n }\n\n static watchCollection(store, prop, callback) {\n const { state: newState, prevState } = store\n const previousPropState = idx(prevState, _ => _[prop])\n const newPropState = idx(newState, _ => _[prop])\n if (Array.isArray(previousPropState)) {\n if (\n previousPropState &&\n previousPropState.length &&\n newPropState.length !== previousPropState.length\n ) {\n // Make sure the callback is a function\n if (typeof callback === 'function') {\n return callback()\n }\n }\n }\n return undefined\n }\n\n static watch(store, prop, callback) {\n const { state: newState, prevState } = store\n const previousPropState = idx(prevState, _ => _[prop])\n const newPropState = idx(newState, _ => _[prop])\n if (\n typeof newPropState === 'boolean' ||\n typeof newPropState === 'string' ||\n typeof newPropState === 'number'\n ) {\n if (previousPropState && newPropState !== previousPropState) {\n // Make sure the callback is a function\n if (typeof callback === 'function') {\n return callback()\n }\n }\n }\n return undefined\n }\n}\nexport default Component\n","class Store {\n constructor(params) {\n // Add some default objects to hold our actions, mutations and state\n // Look in the passed params object for actions and mutations\n // that might have been passed in\n this.actions = params.actions || {}\n this.mutations = params.mutations || {}\n this.state = {}\n this.prevState = {}\n\n // A status enum to set during actions and mutations\n this.status = 'resting'\n\n // We store callbacks for when the state changes in here\n this.callbacks = []\n\n // Set our state to be a Proxy. We are setting the default state by\n // checking the params and defaulting to an empty object if no default\n // state is passed in\n const self = this\n self.state = new Proxy(params.initialState || {}, {\n set(state, key, value) {\n // Set the value as we would normally\n state[key] = value\n\n // eslint-disable-next-line\n // console.log(`stateChange: ${String(key)}: ${value}`)\n\n // Fire off our callback processor because if there's listeners,\n // they're going to want to know that something has changed\n self.processCallbacks(self.state, self.prevState)\n\n if (self.status !== 'mutation') {\n // eslint-disable-next-line\n console.warn(`You should use a mutation to set ${String(key)}`)\n }\n // Reset the status ready for the next operation\n self.status = 'resting'\n\n return true\n },\n })\n }\n\n /**\n * A dispatcher for actions that looks in the actions\n * collection and runs the action if it can find it\n *\n * @param {string} actionKey\n * @param {object} payload\n * @returns {boolean}\n * @memberof Store\n */\n dispatch(actionKey, payload) {\n // Run a quick check to see if the action actually exists\n // before we try to run it\n if (typeof this.actions[actionKey] !== 'function') {\n console.error(`Action \"${actionKey}\" doesn't exist.`)\n return false\n }\n\n // Let anything that's watching the status know that we're dispatching an action\n this.status = 'action'\n\n // Actually call the action and pass it the Store context and whatever payload was passed\n return this.actions[actionKey](this, payload)\n }\n\n /**\n * A dispatcher for actions that looks in the actions\n * collection and runs the action if it can find it\n * and returns a Promise that resolves when the action is completed\n *\n * @param {string} actionKey\n * @param {object} payload\n * @returns {Promise}\n * @memberof Store\n */\n dispatchWithPromise(actionKey, payload) {\n return new Promise((resolve, reject) => {\n // Run a quick check to see if the action actually exists\n // before we try to run it\n if (typeof this.actions[actionKey] !== 'function') {\n console.error(`Action \"${actionKey}\" doesn't exist.`);\n reject(new Error(`Action \"${actionKey}\" doesn't exist.`));\n } else {\n // Add a callback to the store\n // eslint-disable-next-line no-unused-vars\n const callback = (_state, _prevState) => {\n if (this.status === 'mutation') {\n // Action has completed, remove the callback and resolve the Promise\n this.callbacks = this.callbacks.filter(cb => cb !== callback);\n resolve();\n }\n };\n \n this.subscribe(callback);\n this.dispatch(actionKey, payload)\n .then(() => {})\n .catch((error) => {\n this.callbacks = this.callbacks.filter(cb => cb !== callback);\n reject(error);\n });\n }\n });\n }\n\n \n\n /**\n * Look for a mutation and modify the state object\n * if that mutation exists by calling it\n *\n * @param {string} mutationKey\n * @param {object} payload\n * @returns {boolean}\n * @memberof Store\n */\n commit(mutationKey, payload) {\n // Run a quick check to see if this mutation actually exists\n // before trying to run it\n if (typeof this.mutations[mutationKey] !== 'function') {\n console.error(`Mutation \"${mutationKey}\" doesn't exist`)\n return false\n }\n\n // Let anything that's watching the status know that we're mutating state\n this.status = 'mutation'\n\n this.prevState = Object.assign({}, this.state)\n\n // Get a new version of the state by running the mutation and storing the result of it\n const newState = this.mutations[mutationKey](this.state, payload)\n\n // Update the old state with the new state returned from our mutation\n this.state = newState\n\n return true\n }\n\n /**\n * Fire off each callback that's run whenever the state changes\n * We pass in some data as the one and only parameter.\n * Returns a boolean depending if callbacks were found or not\n *\n * @param {object} state\n * @param {object} prevState\n * @returns {boolean}\n */\n processCallbacks(state, prevState) {\n if (!this.callbacks.length) {\n return false\n }\n\n // We've got callbacks, so loop each one and fire it off\n this.callbacks.forEach(callback => callback(state, prevState))\n\n return true\n }\n\n /**\n * Allow an outside entity to subscribe to state changes with a valid callback.\n * Returns boolean based on wether or not the callback was added to the collection\n *\n * @param {function} callback\n * @returns {boolean}\n */\n subscribe(callback) {\n if (typeof callback !== 'function') {\n console.error('You can only subscribe to Store changes with a valid function')\n return false\n }\n\n // A valid function, so it belongs in our collection\n this.callbacks.push(callback)\n\n return true\n }\n}\n\nexport default Store\n","/**\n * Regex to check only words, no other characters then a space\n * @type {RegExp}\n */\n\nconst onlyWords = /^[\\w\\s]+$/\n\nexport default onlyWords\n","/**\n * Regex to check password\n * Per https://stackoverflow.com/questions/19605150/regex-for-password-must-contain-at-least-eight-characters-at-least-one-number-a\n * Min 1 uppercase letter.\n * Min 1 number.\n * Min 9 characters.\n * Max 30 characters\n * @type {RegExp}\n */\n\nconst password = /^(?=.*[A-Z])(?=.*\\d)[A-Za-z\\d@$!%*?&.,\\-|+~#_/()[\\]{}=]{9,30}$/\n\nexport default password\n","/**\n * Regex to check ean barcodes\n * @type {RegExp}\n */\n\nconst ean = /^\\d{13}$/\n\nexport default ean\n","/**\n * Regex to check a dutch date format\n * @type {RegExp}\n */\n\nconst dateNL = /^(\\d{1,2})(\\/|-)(\\d{1,2})(\\/|-)(\\d{4})$/\n\nexport default dateNL\n","/**\n * Regex to check emails against\n * @type {RegExp}\n */\n\nconst emailRegex = /^(([^<>()[\\]\\\\.,;:\\s@\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,10}))$/\n\nexport default emailRegex\n","/**\n * Regex to check dutch phone numbers against\n * @type {RegExp}\n */\nconst phoneRegex = /^\\s*\\+?\\s*([0-9][\\s-]*){9,20}$/\n\nexport default phoneRegex\n","/**\n * Regex to check dutch zipcodes against\n * @type {RegExp}\n */\n\nconst zipCodeRegex = /^[1-9][0-9]{3}?(?!sa|sd|ss)[a-z|A-Z]{2}$/i\nconst zipCodeRegexStreetOptional = /^[1-9][0-9]{3}(?:(?!sa|sd|ss)[a-z|A-Z]{2})?$/i\n\nexport default { zipCodeRegex, zipCodeRegexStreetOptional }\n","/**\n * Regex to check dutch housenumbers\n * @type {RegExp}\n */\n\nconst houseNumber = /^(?:[a-zA-Z0-9 ]+(?:-(?!$))?)+$/\n\nexport default houseNumber\n","/**\n * Regex to check dutch housenumber additions\n * @type {RegExp}\n */\n\nconst houseNumberAddition = /^[a-zA-Z]+$/\n\nexport default houseNumberAddition\n","/**\n * Regex to check names, with some special characters allowed\n * @type {RegExp}\n */\n\nconst names = /^(?:[\\p{L}\\p{Mn}\\p{Pd}.,'\\s]+)+$/u\n\nexport default names\n","/**\n * Regex to check cd field\n * @type {RegExp}\n */\n\nconst cd = /^[A-Z0-9]{7}$/\n\nexport default cd\n","/**\n * Regex to check pec field\n * @type {RegExp}\n */\n\nconst pec = /^[a-zA-Z0-9-_+]{1}[a-zA-Z0-9-_.+]{0,62}[a-zA-Z0-9-_+]{1}@[a-zA-Z0-9-.]{1,128}[.]{1}[a-zA-Z]{2,60}$/\n\nexport default pec\n","/**\n * Regex to check addresses against\n * @type {RegExp}\n */\n\nconst addressRegex = /^(?:[\\p{L}\\p{Mn}\\p{Pd}.,'\\s\\d]+)+$/u\n\nexport default addressRegex\n","/**\n * Validation types\n */\nimport onlyWordsRegex from './only-words'\nimport passwordRegex from './password'\nimport eanRegex from './ean'\nimport dateNLRegex from './date-nl'\nimport emailRegex from './email'\nimport phoneRegex from './phone'\nimport zipCode from './zipcode'\nimport houseNumberRegex from './house-number'\nimport houseNumberAdditionRegex from './house-number-addition'\nimport names from './names'\nimport cdRegex from './cd'\nimport pecRegex from './pec'\nimport addressRegex from './address'\n\nexport default {\n dateNLRegex,\n eanRegex,\n emailRegex,\n houseNumberRegex,\n houseNumberAdditionRegex,\n names,\n onlyWordsRegex,\n passwordRegex,\n phoneRegex,\n zipCode,\n cdRegex,\n pecRegex,\n addressRegex\n}\n","var root = require('./_root');\n\n/** Built-in value references. */\nvar Symbol = root.Symbol;\n\nmodule.exports = Symbol;\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","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","/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\nmodule.exports = freeGlobal;\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","/** 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","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 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 isObject = require('./isObject'),\n now = require('./now'),\n toNumber = require('./toNumber');\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max,\n nativeMin = Math.min;\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 */\nfunction 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\nmodule.exports = debounce;\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 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 root = require('./_root');\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 */\nvar now = function() {\n return root.Date.now();\n};\n\nmodule.exports = now;\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","/*!\n * validate.js 0.13.1\n *\n * (c) 2013-2019 Nicklas Ansman, 2013 Wrapp\n * Validate.js may be freely distributed under the MIT license.\n * For all details and documentation:\n * http://validatejs.org/\n */\n\n(function(exports, module, define) {\n \"use strict\";\n\n // The main function that calls the validators specified by the constraints.\n // The options are the following:\n // - format (string) - An option that controls how the returned value is formatted\n // * flat - Returns a flat array of just the error messages\n // * grouped - Returns the messages grouped by attribute (default)\n // * detailed - Returns an array of the raw validation data\n // - fullMessages (boolean) - If `true` (default) the attribute name is prepended to the error.\n //\n // Please note that the options are also passed to each validator.\n var validate = function(attributes, constraints, options) {\n options = v.extend({}, v.options, options);\n\n var results = v.runValidations(attributes, constraints, options)\n , attr\n , validator;\n\n if (results.some(function(r) { return v.isPromise(r.error); })) {\n throw new Error(\"Use validate.async if you want support for promises\");\n }\n return validate.processValidationResults(results, options);\n };\n\n var v = validate;\n\n // Copies over attributes from one or more sources to a single destination.\n // Very much similar to underscore's extend.\n // The first argument is the target object and the remaining arguments will be\n // used as sources.\n v.extend = function(obj) {\n [].slice.call(arguments, 1).forEach(function(source) {\n for (var attr in source) {\n obj[attr] = source[attr];\n }\n });\n return obj;\n };\n\n v.extend(validate, {\n // This is the version of the library as a semver.\n // The toString function will allow it to be coerced into a string\n version: {\n major: 0,\n minor: 13,\n patch: 1,\n metadata: null,\n toString: function() {\n var version = v.format(\"%{major}.%{minor}.%{patch}\", v.version);\n if (!v.isEmpty(v.version.metadata)) {\n version += \"+\" + v.version.metadata;\n }\n return version;\n }\n },\n\n // Below is the dependencies that are used in validate.js\n\n // The constructor of the Promise implementation.\n // If you are using Q.js, RSVP or any other A+ compatible implementation\n // override this attribute to be the constructor of that promise.\n // Since jQuery promises aren't A+ compatible they won't work.\n Promise: typeof Promise !== \"undefined\" ? Promise : /* istanbul ignore next */ null,\n\n EMPTY_STRING_REGEXP: /^\\s*$/,\n\n // Runs the validators specified by the constraints object.\n // Will return an array of the format:\n // [{attribute: \"<attribute name>\", error: \"<validation result>\"}, ...]\n runValidations: function(attributes, constraints, options) {\n var results = []\n , attr\n , validatorName\n , value\n , validators\n , validator\n , validatorOptions\n , error;\n\n if (v.isDomElement(attributes) || v.isJqueryElement(attributes)) {\n attributes = v.collectFormValues(attributes);\n }\n\n // Loops through each constraints, finds the correct validator and run it.\n for (attr in constraints) {\n value = v.getDeepObjectValue(attributes, attr);\n // This allows the constraints for an attribute to be a function.\n // The function will be called with the value, attribute name, the complete dict of\n // attributes as well as the options and constraints passed in.\n // This is useful when you want to have different\n // validations depending on the attribute value.\n validators = v.result(constraints[attr], value, attributes, attr, options, constraints);\n\n for (validatorName in validators) {\n validator = v.validators[validatorName];\n\n if (!validator) {\n error = v.format(\"Unknown validator %{name}\", {name: validatorName});\n throw new Error(error);\n }\n\n validatorOptions = validators[validatorName];\n // This allows the options to be a function. The function will be\n // called with the value, attribute name, the complete dict of\n // attributes as well as the options and constraints passed in.\n // This is useful when you want to have different\n // validations depending on the attribute value.\n validatorOptions = v.result(validatorOptions, value, attributes, attr, options, constraints);\n if (!validatorOptions) {\n continue;\n }\n results.push({\n attribute: attr,\n value: value,\n validator: validatorName,\n globalOptions: options,\n attributes: attributes,\n options: validatorOptions,\n error: validator.call(validator,\n value,\n validatorOptions,\n attr,\n attributes,\n options)\n });\n }\n }\n\n return results;\n },\n\n // Takes the output from runValidations and converts it to the correct\n // output format.\n processValidationResults: function(errors, options) {\n errors = v.pruneEmptyErrors(errors, options);\n errors = v.expandMultipleErrors(errors, options);\n errors = v.convertErrorMessages(errors, options);\n\n var format = options.format || \"grouped\";\n\n if (typeof v.formatters[format] === 'function') {\n errors = v.formatters[format](errors);\n } else {\n throw new Error(v.format(\"Unknown format %{format}\", options));\n }\n\n return v.isEmpty(errors) ? undefined : errors;\n },\n\n // Runs the validations with support for promises.\n // This function will return a promise that is settled when all the\n // validation promises have been completed.\n // It can be called even if no validations returned a promise.\n async: function(attributes, constraints, options) {\n options = v.extend({}, v.async.options, options);\n\n var WrapErrors = options.wrapErrors || function(errors) {\n return errors;\n };\n\n // Removes unknown attributes\n if (options.cleanAttributes !== false) {\n attributes = v.cleanAttributes(attributes, constraints);\n }\n\n var results = v.runValidations(attributes, constraints, options);\n\n return new v.Promise(function(resolve, reject) {\n v.waitForResults(results).then(function() {\n var errors = v.processValidationResults(results, options);\n if (errors) {\n reject(new WrapErrors(errors, options, attributes, constraints));\n } else {\n resolve(attributes);\n }\n }, function(err) {\n reject(err);\n });\n });\n },\n\n single: function(value, constraints, options) {\n options = v.extend({}, v.single.options, options, {\n format: \"flat\",\n fullMessages: false\n });\n return v({single: value}, {single: constraints}, options);\n },\n\n // Returns a promise that is resolved when all promises in the results array\n // are settled. The promise returned from this function is always resolved,\n // never rejected.\n // This function modifies the input argument, it replaces the promises\n // with the value returned from the promise.\n waitForResults: function(results) {\n // Create a sequence of all the results starting with a resolved promise.\n return results.reduce(function(memo, result) {\n // If this result isn't a promise skip it in the sequence.\n if (!v.isPromise(result.error)) {\n return memo;\n }\n\n return memo.then(function() {\n return result.error.then(function(error) {\n result.error = error || null;\n });\n });\n }, new v.Promise(function(r) { r(); })); // A resolved promise\n },\n\n // If the given argument is a call: function the and: function return the value\n // otherwise just return the value. Additional arguments will be passed as\n // arguments to the function.\n // Example:\n // ```\n // result('foo') // 'foo'\n // result(Math.max, 1, 2) // 2\n // ```\n result: function(value) {\n var args = [].slice.call(arguments, 1);\n if (typeof value === 'function') {\n value = value.apply(null, args);\n }\n return value;\n },\n\n // Checks if the value is a number. This function does not consider NaN a\n // number like many other `isNumber` functions do.\n isNumber: function(value) {\n return typeof value === 'number' && !isNaN(value);\n },\n\n // Returns false if the object is not a function\n isFunction: function(value) {\n return typeof value === 'function';\n },\n\n // A simple check to verify that the value is an integer. Uses `isNumber`\n // and a simple modulo check.\n isInteger: function(value) {\n return v.isNumber(value) && value % 1 === 0;\n },\n\n // Checks if the value is a boolean\n isBoolean: function(value) {\n return typeof value === 'boolean';\n },\n\n // Uses the `Object` function to check if the given argument is an object.\n isObject: function(obj) {\n return obj === Object(obj);\n },\n\n // Simply checks if the object is an instance of a date\n isDate: function(obj) {\n return obj instanceof Date;\n },\n\n // Returns false if the object is `null` of `undefined`\n isDefined: function(obj) {\n return obj !== null && obj !== undefined;\n },\n\n // Checks if the given argument is a promise. Anything with a `then`\n // function is considered a promise.\n isPromise: function(p) {\n return !!p && v.isFunction(p.then);\n },\n\n isJqueryElement: function(o) {\n return o && v.isString(o.jquery);\n },\n\n isDomElement: function(o) {\n if (!o) {\n return false;\n }\n\n if (!o.querySelectorAll || !o.querySelector) {\n return false;\n }\n\n if (v.isObject(document) && o === document) {\n return true;\n }\n\n // http://stackoverflow.com/a/384380/699304\n /* istanbul ignore else */\n if (typeof HTMLElement === \"object\") {\n return o instanceof HTMLElement;\n } else {\n return o &&\n typeof o === \"object\" &&\n o !== null &&\n o.nodeType === 1 &&\n typeof o.nodeName === \"string\";\n }\n },\n\n isEmpty: function(value) {\n var attr;\n\n // Null and undefined are empty\n if (!v.isDefined(value)) {\n return true;\n }\n\n // functions are non empty\n if (v.isFunction(value)) {\n return false;\n }\n\n // Whitespace only strings are empty\n if (v.isString(value)) {\n return v.EMPTY_STRING_REGEXP.test(value);\n }\n\n // For arrays we use the length property\n if (v.isArray(value)) {\n return value.length === 0;\n }\n\n // Dates have no attributes but aren't empty\n if (v.isDate(value)) {\n return false;\n }\n\n // If we find at least one property we consider it non empty\n if (v.isObject(value)) {\n for (attr in value) {\n return false;\n }\n return true;\n }\n\n return false;\n },\n\n // Formats the specified strings with the given values like so:\n // ```\n // format(\"Foo: %{foo}\", {foo: \"bar\"}) // \"Foo bar\"\n // ```\n // If you want to write %{...} without having it replaced simply\n // prefix it with % like this `Foo: %%{foo}` and it will be returned\n // as `\"Foo: %{foo}\"`\n format: v.extend(function(str, vals) {\n if (!v.isString(str)) {\n return str;\n }\n return str.replace(v.format.FORMAT_REGEXP, function(m0, m1, m2) {\n if (m1 === '%') {\n return \"%{\" + m2 + \"}\";\n } else {\n return String(vals[m2]);\n }\n });\n }, {\n // Finds %{key} style patterns in the given string\n FORMAT_REGEXP: /(%?)%\\{([^\\}]+)\\}/g\n }),\n\n // \"Prettifies\" the given string.\n // Prettifying means replacing [.\\_-] with spaces as well as splitting\n // camel case words.\n prettify: function(str) {\n if (v.isNumber(str)) {\n // If there are more than 2 decimals round it to two\n if ((str * 100) % 1 === 0) {\n return \"\" + str;\n } else {\n return parseFloat(Math.round(str * 100) / 100).toFixed(2);\n }\n }\n\n if (v.isArray(str)) {\n return str.map(function(s) { return v.prettify(s); }).join(\", \");\n }\n\n if (v.isObject(str)) {\n if (!v.isDefined(str.toString)) {\n return JSON.stringify(str);\n }\n\n return str.toString();\n }\n\n // Ensure the string is actually a string\n str = \"\" + str;\n\n return str\n // Splits keys separated by periods\n .replace(/([^\\s])\\.([^\\s])/g, '$1 $2')\n // Removes backslashes\n .replace(/\\\\+/g, '')\n // Replaces - and - with space\n .replace(/[_-]/g, ' ')\n // Splits camel cased words\n .replace(/([a-z])([A-Z])/g, function(m0, m1, m2) {\n return \"\" + m1 + \" \" + m2.toLowerCase();\n })\n .toLowerCase();\n },\n\n stringifyValue: function(value, options) {\n var prettify = options && options.prettify || v.prettify;\n return prettify(value);\n },\n\n isString: function(value) {\n return typeof value === 'string';\n },\n\n isArray: function(value) {\n return {}.toString.call(value) === '[object Array]';\n },\n\n // Checks if the object is a hash, which is equivalent to an object that\n // is neither an array nor a function.\n isHash: function(value) {\n return v.isObject(value) && !v.isArray(value) && !v.isFunction(value);\n },\n\n contains: function(obj, value) {\n if (!v.isDefined(obj)) {\n return false;\n }\n if (v.isArray(obj)) {\n return obj.indexOf(value) !== -1;\n }\n return value in obj;\n },\n\n unique: function(array) {\n if (!v.isArray(array)) {\n return array;\n }\n return array.filter(function(el, index, array) {\n return array.indexOf(el) == index;\n });\n },\n\n forEachKeyInKeypath: function(object, keypath, callback) {\n if (!v.isString(keypath)) {\n return undefined;\n }\n\n var key = \"\"\n , i\n , escape = false;\n\n for (i = 0; i < keypath.length; ++i) {\n switch (keypath[i]) {\n case '.':\n if (escape) {\n escape = false;\n key += '.';\n } else {\n object = callback(object, key, false);\n key = \"\";\n }\n break;\n\n case '\\\\':\n if (escape) {\n escape = false;\n key += '\\\\';\n } else {\n escape = true;\n }\n break;\n\n default:\n escape = false;\n key += keypath[i];\n break;\n }\n }\n\n return callback(object, key, true);\n },\n\n getDeepObjectValue: function(obj, keypath) {\n if (!v.isObject(obj)) {\n return undefined;\n }\n\n return v.forEachKeyInKeypath(obj, keypath, function(obj, key) {\n if (v.isObject(obj)) {\n return obj[key];\n }\n });\n },\n\n // This returns an object with all the values of the form.\n // It uses the input name as key and the value as value\n // So for example this:\n // <input type=\"text\" name=\"email\" value=\"foo@bar.com\" />\n // would return:\n // {email: \"foo@bar.com\"}\n collectFormValues: function(form, options) {\n var values = {}\n , i\n , j\n , input\n , inputs\n , option\n , value;\n\n if (v.isJqueryElement(form)) {\n form = form[0];\n }\n\n if (!form) {\n return values;\n }\n\n options = options || {};\n\n inputs = form.querySelectorAll(\"input[name], textarea[name]\");\n for (i = 0; i < inputs.length; ++i) {\n input = inputs.item(i);\n\n if (v.isDefined(input.getAttribute(\"data-ignored\"))) {\n continue;\n }\n\n var name = input.name.replace(/\\./g, \"\\\\\\\\.\");\n value = v.sanitizeFormValue(input.value, options);\n if (input.type === \"number\") {\n value = value ? +value : null;\n } else if (input.type === \"checkbox\") {\n if (input.attributes.value) {\n if (!input.checked) {\n value = values[name] || null;\n }\n } else {\n value = input.checked;\n }\n } else if (input.type === \"radio\") {\n if (!input.checked) {\n value = values[name] || null;\n }\n }\n values[name] = value;\n }\n\n inputs = form.querySelectorAll(\"select[name]\");\n for (i = 0; i < inputs.length; ++i) {\n input = inputs.item(i);\n if (v.isDefined(input.getAttribute(\"data-ignored\"))) {\n continue;\n }\n\n if (input.multiple) {\n value = [];\n for (j in input.options) {\n option = input.options[j];\n if (option && option.selected) {\n value.push(v.sanitizeFormValue(option.value, options));\n }\n }\n } else {\n var _val = typeof input.options[input.selectedIndex] !== 'undefined' ? input.options[input.selectedIndex].value : /* istanbul ignore next */ '';\n value = v.sanitizeFormValue(_val, options);\n }\n values[input.name] = value;\n }\n\n return values;\n },\n\n sanitizeFormValue: function(value, options) {\n if (options.trim && v.isString(value)) {\n value = value.trim();\n }\n\n if (options.nullify !== false && value === \"\") {\n return null;\n }\n return value;\n },\n\n capitalize: function(str) {\n if (!v.isString(str)) {\n return str;\n }\n return str[0].toUpperCase() + str.slice(1);\n },\n\n // Remove all errors who's error attribute is empty (null or undefined)\n pruneEmptyErrors: function(errors) {\n return errors.filter(function(error) {\n return !v.isEmpty(error.error);\n });\n },\n\n // In\n // [{error: [\"err1\", \"err2\"], ...}]\n // Out\n // [{error: \"err1\", ...}, {error: \"err2\", ...}]\n //\n // All attributes in an error with multiple messages are duplicated\n // when expanding the errors.\n expandMultipleErrors: function(errors) {\n var ret = [];\n errors.forEach(function(error) {\n // Removes errors without a message\n if (v.isArray(error.error)) {\n error.error.forEach(function(msg) {\n ret.push(v.extend({}, error, {error: msg}));\n });\n } else {\n ret.push(error);\n }\n });\n return ret;\n },\n\n // Converts the error mesages by prepending the attribute name unless the\n // message is prefixed by ^\n convertErrorMessages: function(errors, options) {\n options = options || {};\n\n var ret = []\n , prettify = options.prettify || v.prettify;\n errors.forEach(function(errorInfo) {\n var error = v.result(errorInfo.error,\n errorInfo.value,\n errorInfo.attribute,\n errorInfo.options,\n errorInfo.attributes,\n errorInfo.globalOptions);\n\n if (!v.isString(error)) {\n ret.push(errorInfo);\n return;\n }\n\n if (error[0] === '^') {\n error = error.slice(1);\n } else if (options.fullMessages !== false) {\n error = v.capitalize(prettify(errorInfo.attribute)) + \" \" + error;\n }\n error = error.replace(/\\\\\\^/g, \"^\");\n error = v.format(error, {\n value: v.stringifyValue(errorInfo.value, options)\n });\n ret.push(v.extend({}, errorInfo, {error: error}));\n });\n return ret;\n },\n\n // In:\n // [{attribute: \"<attributeName>\", ...}]\n // Out:\n // {\"<attributeName>\": [{attribute: \"<attributeName>\", ...}]}\n groupErrorsByAttribute: function(errors) {\n var ret = {};\n errors.forEach(function(error) {\n var list = ret[error.attribute];\n if (list) {\n list.push(error);\n } else {\n ret[error.attribute] = [error];\n }\n });\n return ret;\n },\n\n // In:\n // [{error: \"<message 1>\", ...}, {error: \"<message 2>\", ...}]\n // Out:\n // [\"<message 1>\", \"<message 2>\"]\n flattenErrorsToArray: function(errors) {\n return errors\n .map(function(error) { return error.error; })\n .filter(function(value, index, self) {\n return self.indexOf(value) === index;\n });\n },\n\n cleanAttributes: function(attributes, whitelist) {\n function whitelistCreator(obj, key, last) {\n if (v.isObject(obj[key])) {\n return obj[key];\n }\n return (obj[key] = last ? true : {});\n }\n\n function buildObjectWhitelist(whitelist) {\n var ow = {}\n , lastObject\n , attr;\n for (attr in whitelist) {\n if (!whitelist[attr]) {\n continue;\n }\n v.forEachKeyInKeypath(ow, attr, whitelistCreator);\n }\n return ow;\n }\n\n function cleanRecursive(attributes, whitelist) {\n if (!v.isObject(attributes)) {\n return attributes;\n }\n\n var ret = v.extend({}, attributes)\n , w\n , attribute;\n\n for (attribute in attributes) {\n w = whitelist[attribute];\n\n if (v.isObject(w)) {\n ret[attribute] = cleanRecursive(ret[attribute], w);\n } else if (!w) {\n delete ret[attribute];\n }\n }\n return ret;\n }\n\n if (!v.isObject(whitelist) || !v.isObject(attributes)) {\n return {};\n }\n\n whitelist = buildObjectWhitelist(whitelist);\n return cleanRecursive(attributes, whitelist);\n },\n\n exposeModule: function(validate, root, exports, module, define) {\n if (exports) {\n if (module && module.exports) {\n exports = module.exports = validate;\n }\n exports.validate = validate;\n } else {\n root.validate = validate;\n if (validate.isFunction(define) && define.amd) {\n define([], function () { return validate; });\n }\n }\n },\n\n warn: function(msg) {\n if (typeof console !== \"undefined\" && console.warn) {\n console.warn(\"[validate.js] \" + msg);\n }\n },\n\n error: function(msg) {\n if (typeof console !== \"undefined\" && console.error) {\n console.error(\"[validate.js] \" + msg);\n }\n }\n });\n\n validate.validators = {\n // Presence validates that the value isn't empty\n presence: function(value, options) {\n options = v.extend({}, this.options, options);\n if (options.allowEmpty !== false ? !v.isDefined(value) : v.isEmpty(value)) {\n return options.message || this.message || \"can't be blank\";\n }\n },\n length: function(value, options, attribute) {\n // Empty values are allowed\n if (!v.isDefined(value)) {\n return;\n }\n\n options = v.extend({}, this.options, options);\n\n var is = options.is\n , maximum = options.maximum\n , minimum = options.minimum\n , tokenizer = options.tokenizer || function(val) { return val; }\n , err\n , errors = [];\n\n value = tokenizer(value);\n var length = value.length;\n if(!v.isNumber(length)) {\n return options.message || this.notValid || \"has an incorrect length\";\n }\n\n // Is checks\n if (v.isNumber(is) && length !== is) {\n err = options.wrongLength ||\n this.wrongLength ||\n \"is the wrong length (should be %{count} characters)\";\n errors.push(v.format(err, {count: is}));\n }\n\n if (v.isNumber(minimum) && length < minimum) {\n err = options.tooShort ||\n this.tooShort ||\n \"is too short (minimum is %{count} characters)\";\n errors.push(v.format(err, {count: minimum}));\n }\n\n if (v.isNumber(maximum) && length > maximum) {\n err = options.tooLong ||\n this.tooLong ||\n \"is too long (maximum is %{count} characters)\";\n errors.push(v.format(err, {count: maximum}));\n }\n\n if (errors.length > 0) {\n return options.message || errors;\n }\n },\n numericality: function(value, options, attribute, attributes, globalOptions) {\n // Empty values are fine\n if (!v.isDefined(value)) {\n return;\n }\n\n options = v.extend({}, this.options, options);\n\n var errors = []\n , name\n , count\n , checks = {\n greaterThan: function(v, c) { return v > c; },\n greaterThanOrEqualTo: function(v, c) { return v >= c; },\n equalTo: function(v, c) { return v === c; },\n lessThan: function(v, c) { return v < c; },\n lessThanOrEqualTo: function(v, c) { return v <= c; },\n divisibleBy: function(v, c) { return v % c === 0; }\n }\n , prettify = options.prettify ||\n (globalOptions && globalOptions.prettify) ||\n v.prettify;\n\n // Strict will check that it is a valid looking number\n if (v.isString(value) && options.strict) {\n var pattern = \"^-?(0|[1-9]\\\\d*)\";\n if (!options.onlyInteger) {\n pattern += \"(\\\\.\\\\d+)?\";\n }\n pattern += \"$\";\n\n if (!(new RegExp(pattern).test(value))) {\n return options.message ||\n options.notValid ||\n this.notValid ||\n this.message ||\n \"must be a valid number\";\n }\n }\n\n // Coerce the value to a number unless we're being strict.\n if (options.noStrings !== true && v.isString(value) && !v.isEmpty(value)) {\n value = +value;\n }\n\n // If it's not a number we shouldn't continue since it will compare it.\n if (!v.isNumber(value)) {\n return options.message ||\n options.notValid ||\n this.notValid ||\n this.message ||\n \"is not a number\";\n }\n\n // Same logic as above, sort of. Don't bother with comparisons if this\n // doesn't pass.\n if (options.onlyInteger && !v.isInteger(value)) {\n return options.message ||\n options.notInteger ||\n this.notInteger ||\n this.message ||\n \"must be an integer\";\n }\n\n for (name in checks) {\n count = options[name];\n if (v.isNumber(count) && !checks[name](value, count)) {\n // This picks the default message if specified\n // For example the greaterThan check uses the message from\n // this.notGreaterThan so we capitalize the name and prepend \"not\"\n var key = \"not\" + v.capitalize(name);\n var msg = options[key] ||\n this[key] ||\n this.message ||\n \"must be %{type} %{count}\";\n\n errors.push(v.format(msg, {\n count: count,\n type: prettify(name)\n }));\n }\n }\n\n if (options.odd && value % 2 !== 1) {\n errors.push(options.notOdd ||\n this.notOdd ||\n this.message ||\n \"must be odd\");\n }\n if (options.even && value % 2 !== 0) {\n errors.push(options.notEven ||\n this.notEven ||\n this.message ||\n \"must be even\");\n }\n\n if (errors.length) {\n return options.message || errors;\n }\n },\n datetime: v.extend(function(value, options) {\n if (!v.isFunction(this.parse) || !v.isFunction(this.format)) {\n throw new Error(\"Both the parse and format functions needs to be set to use the datetime/date validator\");\n }\n\n // Empty values are fine\n if (!v.isDefined(value)) {\n return;\n }\n\n options = v.extend({}, this.options, options);\n\n var err\n , errors = []\n , earliest = options.earliest ? this.parse(options.earliest, options) : NaN\n , latest = options.latest ? this.parse(options.latest, options) : NaN;\n\n value = this.parse(value, options);\n\n // 86400000 is the number of milliseconds in a day, this is used to remove\n // the time from the date\n if (isNaN(value) || options.dateOnly && value % 86400000 !== 0) {\n err = options.notValid ||\n options.message ||\n this.notValid ||\n \"must be a valid date\";\n return v.format(err, {value: arguments[0]});\n }\n\n if (!isNaN(earliest) && value < earliest) {\n err = options.tooEarly ||\n options.message ||\n this.tooEarly ||\n \"must be no earlier than %{date}\";\n err = v.format(err, {\n value: this.format(value, options),\n date: this.format(earliest, options)\n });\n errors.push(err);\n }\n\n if (!isNaN(latest) && value > latest) {\n err = options.tooLate ||\n options.message ||\n this.tooLate ||\n \"must be no later than %{date}\";\n err = v.format(err, {\n date: this.format(latest, options),\n value: this.format(value, options)\n });\n errors.push(err);\n }\n\n if (errors.length) {\n return v.unique(errors);\n }\n }, {\n parse: null,\n format: null\n }),\n date: function(value, options) {\n options = v.extend({}, options, {dateOnly: true});\n return v.validators.datetime.call(v.validators.datetime, value, options);\n },\n format: function(value, options) {\n if (v.isString(options) || (options instanceof RegExp)) {\n options = {pattern: options};\n }\n\n options = v.extend({}, this.options, options);\n\n var message = options.message || this.message || \"is invalid\"\n , pattern = options.pattern\n , match;\n\n // Empty values are allowed\n if (!v.isDefined(value)) {\n return;\n }\n if (!v.isString(value)) {\n return message;\n }\n\n if (v.isString(pattern)) {\n pattern = new RegExp(options.pattern, options.flags);\n }\n match = pattern.exec(value);\n if (!match || match[0].length != value.length) {\n return message;\n }\n },\n inclusion: function(value, options) {\n // Empty values are fine\n if (!v.isDefined(value)) {\n return;\n }\n if (v.isArray(options)) {\n options = {within: options};\n }\n options = v.extend({}, this.options, options);\n if (v.contains(options.within, value)) {\n return;\n }\n var message = options.message ||\n this.message ||\n \"^%{value} is not included in the list\";\n return v.format(message, {value: value});\n },\n exclusion: function(value, options) {\n // Empty values are fine\n if (!v.isDefined(value)) {\n return;\n }\n if (v.isArray(options)) {\n options = {within: options};\n }\n options = v.extend({}, this.options, options);\n if (!v.contains(options.within, value)) {\n return;\n }\n var message = options.message || this.message || \"^%{value} is restricted\";\n if (v.isString(options.within[value])) {\n value = options.within[value];\n }\n return v.format(message, {value: value});\n },\n email: v.extend(function(value, options) {\n options = v.extend({}, this.options, options);\n var message = options.message || this.message || \"is not a valid email\";\n // Empty values are fine\n if (!v.isDefined(value)) {\n return;\n }\n if (!v.isString(value)) {\n return message;\n }\n if (!this.PATTERN.exec(value)) {\n return message;\n }\n }, {\n PATTERN: /^(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\])$/i\n }),\n equality: function(value, options, attribute, attributes, globalOptions) {\n if (!v.isDefined(value)) {\n return;\n }\n\n if (v.isString(options)) {\n options = {attribute: options};\n }\n options = v.extend({}, this.options, options);\n var message = options.message ||\n this.message ||\n \"is not equal to %{attribute}\";\n\n if (v.isEmpty(options.attribute) || !v.isString(options.attribute)) {\n throw new Error(\"The attribute must be a non empty string\");\n }\n\n var otherValue = v.getDeepObjectValue(attributes, options.attribute)\n , comparator = options.comparator || function(v1, v2) {\n return v1 === v2;\n }\n , prettify = options.prettify ||\n (globalOptions && globalOptions.prettify) ||\n v.prettify;\n\n if (!comparator(value, otherValue, options, attribute, attributes)) {\n return v.format(message, {attribute: prettify(options.attribute)});\n }\n },\n // A URL validator that is used to validate URLs with the ability to\n // restrict schemes and some domains.\n url: function(value, options) {\n if (!v.isDefined(value)) {\n return;\n }\n\n options = v.extend({}, this.options, options);\n\n var message = options.message || this.message || \"is not a valid url\"\n , schemes = options.schemes || this.schemes || ['http', 'https']\n , allowLocal = options.allowLocal || this.allowLocal || false\n , allowDataUrl = options.allowDataUrl || this.allowDataUrl || false;\n if (!v.isString(value)) {\n return message;\n }\n\n // https://gist.github.com/dperini/729294\n var regex =\n \"^\" +\n // protocol identifier\n \"(?:(?:\" + schemes.join(\"|\") + \")://)\" +\n // user:pass authentication\n \"(?:\\\\S+(?::\\\\S*)?@)?\" +\n \"(?:\";\n\n var tld = \"(?:\\\\.(?:[a-z\\\\u00a1-\\\\uffff]{2,}))\";\n\n if (allowLocal) {\n tld += \"?\";\n } else {\n regex +=\n // IP address exclusion\n // private & local networks\n \"(?!(?:10|127)(?:\\\\.\\\\d{1,3}){3})\" +\n \"(?!(?:169\\\\.254|192\\\\.168)(?:\\\\.\\\\d{1,3}){2})\" +\n \"(?!172\\\\.(?:1[6-9]|2\\\\d|3[0-1])(?:\\\\.\\\\d{1,3}){2})\";\n }\n\n regex +=\n // IP address dotted notation octets\n // excludes loopback network 0.0.0.0\n // excludes reserved space >= 224.0.0.0\n // excludes network & broacast addresses\n // (first & last IP address of each class)\n \"(?:[1-9]\\\\d?|1\\\\d\\\\d|2[01]\\\\d|22[0-3])\" +\n \"(?:\\\\.(?:1?\\\\d{1,2}|2[0-4]\\\\d|25[0-5])){2}\" +\n \"(?:\\\\.(?:[1-9]\\\\d?|1\\\\d\\\\d|2[0-4]\\\\d|25[0-4]))\" +\n \"|\" +\n // host name\n \"(?:(?:[a-z\\\\u00a1-\\\\uffff0-9]-*)*[a-z\\\\u00a1-\\\\uffff0-9]+)\" +\n // domain name\n \"(?:\\\\.(?:[a-z\\\\u00a1-\\\\uffff0-9]-*)*[a-z\\\\u00a1-\\\\uffff0-9]+)*\" +\n tld +\n \")\" +\n // port number\n \"(?::\\\\d{2,5})?\" +\n // resource path\n \"(?:[/?#]\\\\S*)?\" +\n \"$\";\n\n if (allowDataUrl) {\n // RFC 2397\n var mediaType = \"\\\\w+\\\\/[-+.\\\\w]+(?:;[\\\\w=]+)*\";\n var urlchar = \"[A-Za-z0-9-_.!~\\\\*'();\\\\/?:@&=+$,%]*\";\n var dataurl = \"data:(?:\"+mediaType+\")?(?:;base64)?,\"+urlchar;\n regex = \"(?:\"+regex+\")|(?:^\"+dataurl+\"$)\";\n }\n\n var PATTERN = new RegExp(regex, 'i');\n if (!PATTERN.exec(value)) {\n return message;\n }\n },\n type: v.extend(function(value, originalOptions, attribute, attributes, globalOptions) {\n if (v.isString(originalOptions)) {\n originalOptions = {type: originalOptions};\n }\n\n if (!v.isDefined(value)) {\n return;\n }\n\n var options = v.extend({}, this.options, originalOptions);\n\n var type = options.type;\n if (!v.isDefined(type)) {\n throw new Error(\"No type was specified\");\n }\n\n var check;\n if (v.isFunction(type)) {\n check = type;\n } else {\n check = this.types[type];\n }\n\n if (!v.isFunction(check)) {\n throw new Error(\"validate.validators.type.types.\" + type + \" must be a function.\");\n }\n\n if (!check(value, options, attribute, attributes, globalOptions)) {\n var message = originalOptions.message ||\n this.messages[type] ||\n this.message ||\n options.message ||\n (v.isFunction(type) ? \"must be of the correct type\" : \"must be of type %{type}\");\n\n if (v.isFunction(message)) {\n message = message(value, originalOptions, attribute, attributes, globalOptions);\n }\n\n return v.format(message, {attribute: v.prettify(attribute), type: type});\n }\n }, {\n types: {\n object: function(value) {\n return v.isObject(value) && !v.isArray(value);\n },\n array: v.isArray,\n integer: v.isInteger,\n number: v.isNumber,\n string: v.isString,\n date: v.isDate,\n boolean: v.isBoolean\n },\n messages: {}\n })\n };\n\n validate.formatters = {\n detailed: function(errors) {return errors;},\n flat: v.flattenErrorsToArray,\n grouped: function(errors) {\n var attr;\n\n errors = v.groupErrorsByAttribute(errors);\n for (attr in errors) {\n errors[attr] = v.flattenErrorsToArray(errors[attr]);\n }\n return errors;\n },\n constraint: function(errors) {\n var attr;\n errors = v.groupErrorsByAttribute(errors);\n for (attr in errors) {\n errors[attr] = errors[attr].map(function(result) {\n return result.validator;\n }).sort();\n }\n return errors;\n }\n };\n\n validate.exposeModule(validate, this, exports, module, define);\n}).call(this,\n typeof exports !== 'undefined' ? /* istanbul ignore next */ exports : null,\n typeof module !== 'undefined' ? /* istanbul ignore next */ module : null,\n typeof define !== 'undefined' ? /* istanbul ignore next */ define : null);\n","module.exports = function() {\n\tthrow new Error(\"define cannot be used indirect\");\n};\n","module.exports = function(module) {\n\tif (!module.webpackPolyfill) {\n\t\tmodule.deprecate = function() {};\n\t\tmodule.paths = [];\n\t\t// module.parent = undefined by default\n\t\tif (!module.children) module.children = [];\n\t\tObject.defineProperty(module, \"loaded\", {\n\t\t\tenumerable: true,\n\t\t\tget: function() {\n\t\t\t\treturn module.l;\n\t\t\t}\n\t\t});\n\t\tObject.defineProperty(module, \"id\", {\n\t\t\tenumerable: true,\n\t\t\tget: function() {\n\t\t\t\treturn module.i;\n\t\t\t}\n\t\t});\n\t\tmodule.webpackPolyfill = 1;\n\t}\n\treturn module;\n};\n"],"sourceRoot":""}