{"version":3,"sources":["../../../config-wrap-start-default.js","../lib/almond.js","views/app/menuItem.js","views/app/menu.js","views/app/menuButtons.js","views/app/mobileMenuButton.js","views/app/header.js","views/app/subHeader.js","views/app/builderHeader.js","views/app/main.js","views/app/mobileMenuItem.js","views/app/mobileMenu.js","views/app/drawer/contentEmpty.js","views/app/drawer.js","views/app/drawer/mergeTagItem.js","views/app/drawer/mergeTagsSection.js","models/app/mergeTagModel.js","models/app/mergeTagCollection.js","views/app/drawer/mergeTagsContent.js","views/app/builder.js","controllers/app/remote.js","controllers/app/drawer.js","views/app/drawer/headerDefault.js","views/app/drawer/footerDefault.js","models/app/drawerModel.js","models/app/drawerCollection.js","views/fields/drawer/stagedField.js","views/fields/drawer/stagingEmpty.js","views/fields/drawer/stagingCollection.js","models/fields/stagingModel.js","models/fields/stagingCollection.js","views/fields/drawer/typeSection.js","views/fields/drawer/typeSectionCollection.js","views/fields/drawer/addField.js","views/app/drawer/itemSettingCollection.js","views/app/drawer/itemSettingGroup.js","views/app/drawer/itemSettingGroupCollection.js","views/app/drawer/editSettings.js","views/app/drawer/headerEditSettings.js","views/actions/drawer/typeButton.js","views/actions/drawer/typeCollection.js","views/actions/drawer/addAction.js","views/app/drawer/contentViewChangesItem.js","views/app/drawer/contentViewChanges.js","views/app/drawer/headerViewChanges.js","views/app/drawer/settingError.js","views/app/drawer/itemSetting.js","views/app/drawer/contentNewForm.js","views/app/drawer/headerNewForm.js","controllers/app/drawerConfig.js","views/app/drawer/defaultSettingsTitle.js","views/app/empty.js","models/app/domainModel.js","models/app/domainCollection.js","views/fields/subHeader.js","views/fields/mainContentFieldCollection.js","views/fields/drawer/addSavedField.js","views/fields/drawer/settingsTitle.js","views/actions/mainHeader.js","views/actions/subHeader.js","views/app/itemControls.js","views/actions/actionItem.js","views/actions/mainContentEmpty.js","views/actions/mainContent.js","views/advanced/mainHeader.js","views/advanced/subHeader.js","views/advanced/settingItem.js","views/advanced/mainContent.js","models/fields/fieldModel.js","models/fields/fieldCollection.js","controllers/app/domainConfig.js","models/app/appModel.js","controllers/app/data.js","controllers/app/drawerToggleSettingGroup.js","controllers/app/updateDB.js","models/app/formModel.js","controllers/app/formData.js","controllers/app/previewLink.js","controllers/app/menuButtons.js","models/app/changeModel.js","models/app/changeCollection.js","controllers/app/trackChanges.js","controllers/app/undoChanges.js","controllers/app/publishResponse.js","controllers/app/changeDomain.js","controllers/app/pushstate.js","controllers/app/hotkeys.js","controllers/app/cleanState.js","controllers/app/coreUndo.js","controllers/app/cloneModelDeep.js","controllers/app/getSettingChildView.js","controllers/app/changeSettingDefault.js","views/app/drawer/typeSettingFieldset.js","models/app/settingModel.js","models/app/settingCollection.js","controllers/app/fieldset.js","controllers/app/toggleSetting.js","controllers/app/itemControls.js","controllers/app/mergeTags.js","models/app/mergeTagLookupCollection.js","views/app/drawer/mergeTag.js","views/app/drawer/mergeTagList.js","views/app/drawer/mergeTagGroup.js","views/app/drawer/mergeTagGroupList.js","views/app/drawer/mergeTagFilter.js","views/app/drawer/mergeTagBox.js","controllers/app/mergeTagBox.js","controllers/app/itemSettingFill.js","controllers/app/confirmPublish.js","controllers/app/rte.js","controllers/app/settingFieldSelect.js","controllers/app/settingFieldList.js","controllers/app/settingHTML.js","controllers/app/settingColor.js","controllers/app/changeMenu.js","controllers/app/mobile.js","controllers/app/notices.js","controllers/app/unloadCheck.js","controllers/app/formContentFilters.js","controllers/app/formContentGutterFilters.js","controllers/app/cloneCollectionDeep.js","controllers/app/trackKeyDown.js","controllers/app/perfectScroll.js","models/app/settingGroupModel.js","models/app/settingGroupCollection.js","controllers/app/getNewSettingGroupCollection.js","controllers/app/settingMedia.js","models/app/typeModel.js","models/app/typeCollection.js","models/fields/typeSectionModel.js","models/fields/typeSectionCollection.js","controllers/fields/types.js","controllers/fields/fieldTypeDrag.js","controllers/fields/stagingDrag.js","controllers/fields/staging.js","controllers/fields/stagingSortable.js","controllers/fields/filterTypes.js","controllers/fields/sortable.js","controllers/fields/data.js","models/app/optionRepeaterModel.js","models/app/optionRepeaterCollection.js","views/app/drawer/optionRepeaterError.js","views/app/drawer/optionRepeaterOption.js","views/app/drawer/optionRepeaterEmpty.js","views/app/drawer/optionRepeaterComposite.js","controllers/app/optionRepeater.js","controllers/fields/editActive.js","controllers/fields/fieldSettings.js","controllers/fields/fieldCreditCard.js","controllers/fields/fieldList.js","controllers/fields/fieldPassword.js","controllers/fields/fieldQuantity.js","controllers/fields/fieldShipping.js","controllers/fields/key.js","controllers/fields/notices.js","controllers/fields/mobile.js","controllers/fields/savedFields.js","controllers/fields/fieldDatepicker.js","controllers/fields/fieldDisplayCalc.js","controllers/actions/types.js","models/actions/actionModel.js","models/actions/actionCollection.js","controllers/actions/data.js","controllers/actions/actionSettings.js","controllers/actions/editActive.js","controllers/actions/emailFromSetting.js","controllers/actions/addActionTypes.js","controllers/actions/typeDrag.js","controllers/actions/droppable.js","models/actions/typeModel.js","models/actions/typeCollection.js","controllers/actions/filterTypes.js","controllers/actions/newsletterList.js","controllers/actions/deleteFieldListener.js","controllers/actions/collectPaymentFields.js","controllers/actions/collectPaymentCalculations.js","controllers/actions/collectPaymentFixed.js","controllers/actions/collectPayment.js","controllers/advanced/types.js","models/advanced/settingsModel.js","controllers/advanced/data.js","controllers/advanced/formSettings.js","controllers/advanced/editActive.js","controllers/advanced/clickEdit.js","controllers/advanced/calculations.js","controllers/loadControllers.js","views/fields/fieldItem.js","views/fields/mainContentEmpty.js","views/app/formTitle.js","views/loadViews.js","main.js"],"names":["requirejs","require","define","undef","hasProp","obj","prop","hasOwn","call","normalize","name","baseName","nameParts","nameSegment","mapValue","foundMap","lastIndex","foundI","foundStarMap","starI","i","j","part","baseParts","split","map","config","starMap","charAt","length","nodeIdCompat","jsSuffixRegExp","test","replace","slice","concat","splice","join","indexOf","substring","makeRequire","relName","forceSync","args","aps","arguments","push","req","apply","makeNormalize","makeLoad","depName","value","defined","callDep","waiting","defining","main","Error","splitPrefix","prefix","index","makeConfig","makeMap","handlers","Object","prototype","hasOwnProperty","plugin","parts","f","n","pr","p","exports","e","module","id","uri","deps","callback","cjsModule","ret","usingExports","callbackType","load","undefined","alt","setTimeout","cfg","_defined","amd","jQuery","Marionette","ItemView","extend","tagName","template","initialize","this","listenTo","nfRadio","channel","render","model","on","onRender","$el","children","unwrap","setElement","events","click a","clickAppMenu","trigger","templateHelpers","renderDashicons","dashicons","renderClasses","classes","request","get","renderUrl","url","formModel","renderTarget","renderDisabled","disabled","appMenuItemView","CollectionView","childView","onShow","el","find","bounceIcon","that","renderPublish","publishWidth","maybeDisabled","maybeRenderCancel","click .publish","click .viewChanges","clickPublish","clickViewChanges","changeModel","effect","times","click .nf-mobile-menu","clickMobileMenu","builderEl","toggleClass","appMenuCollectionView","appMenuButtonsView","mobileMenuButtonView","LayoutView","regions","menu","buttons","mobileMenuButton","appDomainCollection","show","collection","click #nf-logo","clickLogo","appHeaderView","appSubHeaderView","app","formTitle","appSub","changeSubHeader","formData","formSettings","formTitleView","currentDomain","subHeaderView","className","maybeDone","offsetRight","offsetLeft","gutterLeft","body","gutterRight","reply","getMainEl","window","context","resizeBothGutters","setBothGuttersAbsolute","setBothGuttersFixed","updateGutters","bodyView","gutterLeftView","gutterRightView","parent","onAttach","initialGutterResize","onBeforeDestroy","off","resize","resizeGutter","data","leftEl","rightEl","clearTimeout","top","offset","viewHeight","height","topLeft","leftLeft","left","css","position","topRight","leftRight","scrollTop","right","mobileDashicon","mobileMenuItemView","CompositeView","attachHtml","collectionView","append","click .nf-publish","drawerEmptyView","header","content","footer","getEl","loadContent","emptyContent","perfectScrollbar","drawerID","drawer","contentView","headerView","footerView","empty","click .nf-toggle-drawer","clickToggleDrawer","clickTag","active","mergeTagItemView","updateFields","fieldCollection","set","Backbone","Model","defaults","exclude","mergeTagModel","Collection","mergeTagsSectionView","MergeTagCollection","getMergeTagsView","reRender","settingModel","mergeTagCollection","defaultGroups","where","default_group","calcMergeTagGroup","useMergeTags","_","each","remove","include","models","sectionModel","add","mainView","mobileMenuView","drawerView","mergeTagsContentView","menuDrawer","mergeTagsContent","getBuilderEl","getBuilderView","mergeTags","mergeTagsClone","clone","click .nf-open-drawer","click .nf-change-domain","click .nf-close-drawer","openDrawer","closeDrawer","changeDomain","addListener","dataModel","listen","updateSetting","clickExtra","getRemote","settingView","srcElement","addClass","remote","parentValue","action","security","nfAdmin","ajaxNonce","post","ajaxurl","response","JSON","parse","options","clickOpenDrawer","toggleDrawerSize","getClosedDrawerPos","preventClose","enableClose","maybePreventClose","objPreventClose","filterFocused","currentDrawer","removeClass","rightClosed","drawerEl","checkCloseDrawerPos","setInterval","clearInterval","target","currentDomainID","hasFocus","checkOpenDrawerPos","focusFilter","filterEl","focus","width","keys","key","getPreventClose","clearFilter","blurFilter","keyup .nf-filter","input .nf-filter","focus input","changeFilter","maybeChangeFilter","keyCode","addObject","trim","val","blur","getFocus","drawerDisabled","defaultHeaderView","defaultFooterView","getHeaderView","getFooterView","drawerModel","click .dashicons-dismiss","removeStagedField","stagedFieldView","stagedFieldsEmptyView","emptyView","activeClass","getStagedFieldsEl","sortable","placeholder","helper","tolerance","over","ui","out","receive","update","start","stop","draggable","opacity","connectToSortable","appendTo","refreshPositions","grid","element","zIndex","onAddChild","onRemoveChild","hasStagedFields","stagingModel","comparator","bindAll","getTypeSection","dragging","drag","disableSelection","click .nf-item","keydown .nf-item","mousedown .nf-item","clickFieldType","mousedownFieldType","maybeClickFieldType","renderFieldTypes","html","fieldTypes","type","nicename","icon","renderType","savedField","fieldTypeSectionView","drawerStagingView","StagingCollection","fieldTypeSectionCollectionView","staging","primary","secondary","filterFieldTypes","removeFieldTypeFilter","savedCollection","primaryCollection","fieldTypeSectionCollection","secondaryCollection","stagingCollection","filteredSectionCollection","reset","childViewOptions","getChildView","itemSettingCollectionView","settings","click .toggle","clickToggleGroup","renderLabel","label","renderArrowDir","display","itemSettingGroupView","itemSettingGroupCollectionView","settingTitle","settingGroups","groupCollection","titleView","maybeRenderTitle","renderTypeNicename","domainID","scroll","clickAddAction","open","image","section","renderStyle","actionTypeButtonView","renderNicename","slug","actionTypeCollectionView","filteractionTypes","removeactionTypeFilter","installedActions","availableActions","filteredInstalled","filteredAvailable","click .undoSingle","undoSingle","viewChangesItem","click .undoChanges","clickUndoChanges","settingErrorView","error","renderError","renderWarning","refresh","drawerOpened","drawerClosed","setting","unescape","silent","onBeforeRender","escape","next","jBox","maxWidth","theme","closeOnClick","mask","input","autoNumeric","aSep","thousandsSeparator","aDec","decimalPoint","currency","currencySymbol","currencySymbols","aSign","text","format","console","log","renderVisible","renderSetting","renderLabelClasses","use_merge_tags","renderTooltip","help","renderMergeTags","hide_merge_tags","renderPlaceholder","change .setting","keyup .setting","click .setting","click .extra","changeSetting","keyUpSetting","clickSetting","itemSettingView","formName","formSubmit","titleSettingModel","addSubmitSettingModel","findWhere","drawerCollection","addFieldView","editSettingsView","editSettingsHeaderView","addActionView","viewChangesView","viewChangesHeaderView","newFormView","newFormHeaderView","mobileItemControlsView","getContentView","typeModel","view","getDrawerCollection","getDrawer","DefaultSettingsTitleView","EmptyView","hotkeys","getSettingsTitleView","getDefaultSettingsTitleView","getGutterLeftView","getGutterRightView","domainModel","reorderOnSort","getEmptyView","getSortableEl","initSortable","destroySortable","cancel","scrollSensitivity","item","dropping","hide","renderAddButton","button","click .nf-button","clickAddSavedField","addSavedFieldView","renderjBoxContent","addSaved","addSavedjBox","destroy","unset","title","x","y","outside","onCreated","setContent","attach","displayName","saved","renderSavedStar","star","actionCollection","mouseover .nf-item-control","click .nf-edit-settings","singletap .nf-item-control","click .nf-item-delete","click .nf-item-duplicate","clickEdit","singleTapEdit","clickDelete","clickDuplicateField","mouseoverItemControl","itemControlsView","itemControls","maybeDeactivate","change input","click","maybeClickEdit","changeToggle","renderToggle","settingName","actionLabel","actionView","droppable","accept","hoverClass","drop","updateActiveClass","editActive","settingItem","objectType","objectDomain","order","fieldType","parentType","updateFieldKey","changedAttributes","keyModel","fieldModel","parseInt","tmpNum","addField","removeField","addNewField","appendNewField","removeFieldResponse","newIDs","removedIDs","at","fieldExists","fieldsSubHeaderView","FieldsMainContentFieldCollectionView","fieldsSettingsTitleView","actionsMainHeaderView","actionsSubHeaderView","actionsMainContentView","settingsMainHeaderView","settingsSubHeaderView","settingsMainContentView","FieldCollection","defaultFormContentView","defaultFormContentLoad","defaultFormContentGutterView","nfi18n","domainFormFields","Esc","Ctrl+Shift+n","Ctrl+Shift+a","Ctrl+Shift+s","Alt+Ctrl+t","up","down","Shift+return","getSubHeaderView","getMainContentView","formContentData","formContentLoadFilters","sortedArray","without","first","formContentViewFilters","formContentView","gutterFilters","gutterView","domainActions","Ctrl+Shift+f","domainAdvanced","previewurl","getDomainCollection","getDomainModel","fieldModels","loading","changeStatus","appModel","clean","mobile","isMobile","getData","getSetting","getCurrentDomain","getCurrentDrawer","updateCurrentDomain","updateCurrentDrawer","currentDrawerID","toggleSettingGroup","errors","updateDB","defaultSaveFilter","jsAction","formContentSaveDataFilters","stringify","fields","field","parent_id","deleted_fields","actions","deleted_actions","autoClose","form","exception","fail","xhr","status","alert","pluck","isNumeric","preloadedFormData","getFormModel","disablePreview","enablePreview","changePreviewNicename","appDomains","preview","publish","viewChanges","changeCollection","cid","ChangeModel","registerChange","getCollection","maybeResetCollection","changes","dashicon","undoChanges","sort","change","undoAll","publishResponse","new_ids","newID","oldID","forms","history","replaceState","changeAppDomain","preventChange","enableChange","objPreventChange","maybePreventChange","mainEl","changePushState","pushState","location","href","reExp","toString","newUrl","changeHotkeys","addNewAction","changeDomainFields","changeDomainActions","changeDomainSettings","document","hotkey","msg","fieldsDomain","actionsDomain","settingsDomain","ignoreAttributes","setAppClean","attr","undoChangeSetting","undoAddObject","undoRemoveObject","undoDuplicateObject","undoSortFields","undoAddListOption","undoRemoveListOption","undoSortListOptions","before","maybeRemoveChange","objectModel","results","objectCollection","objModels","cloneModelDeep","attributes","clonedCollection","newModel","getSettingChildView","after","object","maybePreventUI","updateKey","fieldsetView","settingCollection","createSettingsCollection","settingTypeModel","clickDuplicate","tmpID","tagSectionCollection","tagSection","tags","fieldTags","tag","getFieldKeyFormat","calcTags","calcCollection","calcModel","currentElement","clickMergeTag","addFieldTags","deleteFieldTags","updateCalcTags","updateCurrentElement","updateCurrentSetting","getSectionModel","updateID","replaceFieldKey","initMergeTags","mergeTagsView","jBoxes","closeOnEsc","maxHeight","onOpen","prev","onClose","tagModel","currentValue","currentPos","caret","newPos","substr","summernote","calcTag","getFieldKeyFormatCalc","fieldID","optionModel","calc","openMergeTags","returnMergeTags","preventDefault","currentModel","upMergeTags","changeActiveTag","downMergeTags","dir","inc","currentIndex","nextModel","userInfo","system","updateOpen","targetTag","oldTag","fieldMergeTag","newKey","oldKey","_previousAttributes","oldVal","oldCalcKey","newCalcKey","re","RegExp","newVal","insertTag","mergeTagView","sectionFilter","searchFilter","filter","child","term","toLowerCase","removeActive","onClick","updateTags","setActive","siblings","mergeTagGroupView","keyup input","updateFilter","event","firstFilteredTag","sections","MergeTagModel","MergeTagLookupCollection","MergeTagView","MergeTagListView","MergeTagGroupView","MergeTagGroupListView","MergeTagFilterView","MergeTagBoxLayout","old","mergeTagsButtonClick","afterAppStart","beforeRenderSetting","beforeDrawerClose","bind","selector","focusCallback","keyupCallback","closest","Radio","layout","tagCollection","mergeTagListView","mergeTagGroupListView","getRegion","rteEditor","posY","outerHeight","boxHeight","repeaterRow","scrollLeft","posX","$input","hasClass","str","caretPos","patt","match","exec","string","childNode","childNodes","node","nodeValue","innerHTML","range","createRange","sel","getSelection","setStart","err","collapse","removeAllRanges","addRange","$this","$inputSetting","autocomplete","$overlayElement","dataID","so","mergetags","mergetag","confirmPublish","initSettingModel","destroySetting","meta_image_frame","icons","align","alignCenter","alignJustify","alignLeft","alignRight","indent","outdent","bold","close","code","eraser","italic","link","unlink","magic","minus","orderedlist","redo","square","table","underline","undo","unorderedlist","currentContext","initRTE","linkButton","mediaButton","toolbar","codemirror","lineNumbers","callbacks","onBlur","editor","getValue","updateDataModel","prettifyHtml","onFocus","onKeydown","onKeyup","linkMenu","replaceWith","class","removeRTE","linkDropdown","buttonGroup","contents","tooltip","clickLinkButton","toggle","dropdown","mergeTagsButton","openMediaManager","invoke","wp","media","frames","media_attachment","state","toJSON","insertMedia","textEl","urlEl","isNewWindowEl","isNewWindow","filename","trackKeyChanges","beforeRender","maybeSwitchToFieldsDomain","autoOpenDrawer","filterDrawerContents","SwitchToFieldsDomain","updateFieldMap","contains","fieldFilter","bail","fieldTypeModel","rubble","filterDrawer","switchDomain","fieldDomainModel","fieldListSettings","registerFieldListSettings","updateFieldListSettingKeys","changed","actionModel","lastChanged","oldValue","init","changedSettingValue","setRenderFalse","closeColorPickers","initColorPicker","wpColorPicker","color","editFormText","changeMenu","formPublish","isNewForm","highlightAddNew","appendEditForm","form_id","isNaN","closeMobileMenu","addNotice","closeNotice","notices","appDefaults","constructOnInit","stack","animation","mobileDefaults","desktopDefaults","openNotice","maybePrompt","viewFilters","saveFilters","loadFilters","addViewFilter","addSaveFilter","addLoadFilter","getViewFilters","getSaveFilters","getLoadFilters","priority","leftFilters","rightFilters","addLeftFilter","addRightFilter","getLeftFilters","getRightFilters","cloneCollectionDeep","constructor","keyDown","keyUp","getKeyDown","movedPos","initPerfectScroll","moveRail","resetRail","suppressScrollX","outerWidth","SettingCollection","settingGroupModel","SettingGroupCollection","getNewSettingGroupCollection","option","typeSectionModel","TypeCollection","SectionCollection","fieldTypeSections","registerSection","fieldTypeData","getFieldType","getTypeCollection","getTypeSections","getSavedFields","shiftKey","startDrag","stopDrag","getCurrentDraggableHelperClone","style","setProperty","draggableHelperClone","stagedFields","num","addStagedField","getStagingCollection","sortStagedFields","clearStagedFields","beforeCloseDrawer","now","tmpField","sortableEl","search","pos","receiveStagedFields","overStagedFields","outStagedFields","startStagedFields","stopStagedFields","addActiveClass","stagedFieldsEl","removeActiveClass","currentHelper","helperClone","filtered","filterCollection","found","alias","receiveFieldsSortable","overfieldsSortable","outFieldsSortable","stopFieldsSortable","startFieldsSortable","updateFieldsSortable","insertedAt","fieldWidth","dragFieldID","dragModel","oldPos","adding","removing","getFieldCollection","getField","redrawFieldCollection","getTmpFieldID","deleteField","sortFields","getAdding","setAdding","getRemoving","setRemoving","renderTrigger","savedType","updateFieldSetting","max_options","changeErrors","size","errorsFound","opt","listOptionModel","addOption","renderErrors","ErrorView","columns","parentView","hasErrors","click .nf-delete","keyup","changeOption","deleteOption","keyupOption","maybeAddOption","findByIndex","getColumns","renderFieldSelect","_return","selected","renderOptions","column","listOptionView","listEmptyView","listOptionCollection","optionCollection","maybeHideNew","handle","forcePlaceholderSize","importLink","closeButton","clickImport","renderHeaders","col","renderFieldsetClasses","currency_symbol","click .nf-add-new","limit","clickAddOption","textarea","trimLeft","trimRight","lines","isArray","line","row","slugify","separator","listCompositeView","updateOptionSortable","stopOptionSortable","startOptionSortable","convertSettings","optionView","triggerDataModel","modelData","new","default","newOrder","clearEditActive","fieldSettings","getSettingModel","getSettingCollection","dropCreditCardField","newField","stageCreditCardField","ListOptionCollection","updateOptionLabel","updateOptionValue","convertOptions","select","insertField","productFields","getProductFields","addMask","newFieldKey","updateLabel","d","Date","valueOf","setError","keyExists","testKey","startWiggle","stopWiggle","initWiggle","ClassyWiggle","degrees","delay","updateField","modified","modelClone","fieldData","created_at","formID","newType","newTypeDefaults","settingDefaults","typeCollection","addDatepicker","pikadayResponsive","actionTypeData","installed","available","getType","getInstalledActions","getAvailableActions","actionType","addAction","removeAction","getAction","getTmpID","deleteAction","actionSettings","updateFromAddress","isValidEmail","home_url_host","errorInvalidEmailFromAddress","email","dropActionType","type_slug","actionTypeModel","filterActionTypes","newInstalled","newAvailable","defaultFields","clickListUpdate","maybeRenderFields","maybeRenderGroups","registerFieldsListener","registerGroupsListener","updateFieldMapping","updateInterestGroups","updateLists","lists","always","selectedList","list","groups","group","registerListener","maybeUpdateSettings","newObject","isString","isObject","mapObject","filteredCollection","every","getFields","field_key","returnFields","sortBy","calcModels","calcs","getCalcs","returnCalcs","isEmpty","initCollectPayment","maybeClearTotal","maybeUpdateTotal","maybeError","oldName","formSettingTypeData","settingsModel","getSettings","updateCalc","sortCalc","checkName","checkEQ","checkDec","checkAllCalcs","nameExists","eq","errorSelfRef","errorFutureCalc","calculations","targetCalc","selfRef","futureCalc","dec","errorNonIntDec","checked","Math","abs","nonIntDec","Remote","Drawer","DrawerConfig","DomainConfig","AppData","DrawerToggleSettingGroup","UpdateDB","FormData","PreviewLink","AppMenuButtons","AppTrackChanges","AppUndoChanges","AppPublishResponse","AppChangeDomain","Pushstate","Hotkeys","CleanState","CoreUndo","CloneModelDeep","DrawerSettingChildView","ChangeSettingDefault","Fieldset","ToggleSetting","ItemControls","MergeTags","MergeTagsBox","ItemSettingFill","ConfirmPublish","RTE","SettingFieldSelect","SettingFieldList","SettingHTML","SettingColor","ChangeMenu","AppMobile","AppNotices","AppUnloadCheck","FormContentFilters","FormContentGutterFilters","CloneCollectionDeep","TrackKeyDown","PerfectScroll","GetNewSettingGroupCollection","SettingMedia","FieldTypes","FieldTypeDrag","FieldStagingDrag","StagedFieldsData","StagedFieldsSortable","DrawerFilterFieldTypes","MainContentFieldsSortable","FieldData","OptionRepeater","FieldsEditActive","FieldSettings","FieldCreditCard","FieldList","FieldPassword","FieldQuantity","FieldShipping","FieldKey","Notices","FieldsMobile","SavedFields","FieldDatepicker","FieldDisplayCalc","ActionTypes","ActionData","ActionSettings","ActionEditActive","ActionEmailFromSetting","ActionAddTypes","ActionTypeDrag","ActionDroppable","ActionFilterTypes","ActionNewsletterList","ActionDeleteFieldListener","ActionCollectPaymentFields","ActionCollectPaymentCalculations","ActionCollectPaymentFixed","ActionCollectPayment","SettingTypes","SettingData","FormSettings","SettingsEditActive","SettingsClickEdit","AdvancedCalculations","doingShortcut","touch","renderRequired","required","getFieldID","renderIcon","mousedown","singletap","swipeleft","swiperight","tapend","maybeShortcut","maybeTapEdit","swipeLeft","startEvnt","swipeRight","renderTitle","fieldItemView","mainContentEmptyView","FormTitleView","getFieldItem","getMainContentEmpty","getFormTitle","ready","$","BuilderView","LoadControllers","LoadViews","Application","Renderer","onStart","evaluate","interpolate","variable"],"mappings":"CAAA,WCUA,GAAAA,GAAAC,EAAAC,GACA,SAAAC,GAUA,QAAAC,GAAAC,EAAAC,GACA,MAAAC,GAAAC,KAAAH,EAAAC,GAWA,QAAAG,GAAAC,EAAAC,GACA,GAAAC,GAAAC,EAAAC,EAAAC,EAAAC,EACAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EACAC,EAAAZ,GAAAA,EAAAa,MAAA,KACAC,EAAAC,EAAAD,IACAE,EAAAF,GAAAA,EAAA,QAGA,IAAAf,GAAA,MAAAA,EAAAkB,OAAA,GAIA,GAAAjB,EAAA,CAgBA,IAfAD,EAAAA,EAAAc,MAAA,KACAR,EAAAN,EAAAmB,OAAA,EAGAH,EAAAI,cAAAC,EAAAC,KAAAtB,EAAAM,MACAN,EAAAM,GAAAN,EAAAM,GAAAiB,QAAAF,EAAA,KAOArB,EAAAa,EAAAW,MAAA,EAAAX,EAAAM,OAAA,GAAAM,OAAAzB,GAGAU,EAAA,EAAAA,EAAAV,EAAAmB,OAAAT,GAAA,EAEA,GAAA,OADAE,EAAAZ,EAAAU,IAEAV,EAAA0B,OAAAhB,EAAA,GACAA,GAAA,MACA,IAAA,OAAAE,EAAA,CACA,GAAA,IAAAF,IAAA,OAAAV,EAAA,IAAA,OAAAA,EAAA,IAOA,KACAU,GAAA,IACAV,EAAA0B,OAAAhB,EAAA,EAAA,GACAA,GAAA,GAMAV,EAAAA,EAAA2B,KAAA,SACA,KAAA3B,EAAA4B,QAAA,QAGA5B,EAAAA,EAAA6B,UAAA,GAKA,KAAAhB,GAAAI,IAAAF,EAAA,CAGA,IAFAb,EAAAF,EAAAc,MAAA,KAEAJ,EAAAR,EAAAiB,OAAAT,EAAA,EAAAA,GAAA,EAAA,CAGA,GAFAP,EAAAD,EAAAsB,MAAA,EAAAd,GAAAiB,KAAA,KAEAd,EAGA,IAAAF,EAAAE,EAAAM,OAAAR,EAAA,EAAAA,GAAA,EAKA,IAJAP,EAAAW,EAAAF,EAAAW,MAAA,EAAAb,GAAAgB,KAAA,SAKAvB,EAAAA,EAAAD,IACA,CAEAE,EAAAD,EACAG,EAAAG,CACA,OAMA,GAAAL,EACA,OAMAG,GAAAS,GAAAA,EAAAd,KACAK,EAAAS,EAAAd,GACAM,EAAAC,IAIAL,GAAAG,IACAH,EAAAG,EACAD,EAAAE,GAGAJ,IACAH,EAAAwB,OAAA,EAAAnB,EAAAF,GACAL,EAAAE,EAAAyB,KAAA,MAIA,MAAA3B,GAGA,QAAA8B,GAAAC,EAAAC,GACA,MAAA,YAIA,GAAAC,GAAAC,EAAApC,KAAAqC,UAAA,EAQA,OAHA,gBAAAF,GAAA,IAAA,IAAAA,EAAAd,QACAc,EAAAG,KAAA,MAEAC,EAAAC,MAAA7C,EAAAwC,EAAAR,QAAAM,EAAAC,MAIA,QAAAO,GAAAR,GACA,MAAA,UAAA/B,GACA,MAAAD,GAAAC,EAAA+B,IAIA,QAAAS,GAAAC,GACA,MAAA,UAAAC,GACAC,EAAAF,GAAAC,GAIA,QAAAE,GAAA5C,GACA,GAAAN,EAAAmD,EAAA7C,GAAA,CACA,GAAAiC,GAAAY,EAAA7C,SACA6C,GAAA7C,GACA8C,EAAA9C,IAAA,EACA+C,EAAAT,MAAA7C,EAAAwC,GAGA,IAAAvC,EAAAiD,EAAA3C,KAAAN,EAAAoD,EAAA9C,GACA,KAAA,IAAAgD,OAAA,MAAAhD,EAEA,OAAA2C,GAAA3C,GAMA,QAAAiD,GAAAjD,GACA,GAAAkD,GACAC,EAAAnD,EAAAA,EAAA4B,QAAA,MAAA,CAKA,OAJAuB,IAAA,IACAD,EAAAlD,EAAA6B,UAAA,EAAAsB,GACAnD,EAAAA,EAAA6B,UAAAsB,EAAA,EAAAnD,EAAAmB,UAEA+B,EAAAlD,GA8CA,QAAAoD,GAAApD,GACA,MAAA,YACA,MAAAgB,IAAAA,EAAAA,QAAAA,EAAAA,OAAAhB,QA1OA,GAAA+C,GAAAV,EAAAgB,EAAAC,EACAX,KACAE,KACA7B,KACA8B,KACAjD,EAAA0D,OAAAC,UAAAC,eACAvB,KAAAV,MACAH,EAAA,OA2LAgC,GAAA,SAAArD,EAAA+B,GACA,GAAA2B,GACAC,EAAAV,EAAAjD,GACAkD,EAAAS,EAAA,EA2BA,OAzBA3D,GAAA2D,EAAA,GAEAT,IACAA,EAAAnD,EAAAmD,EAAAnB,GACA2B,EAAAd,EAAAM,IAIAA,EAEAlD,EADA0D,GAAAA,EAAA3D,UACA2D,EAAA3D,UAAAC,EAAAuC,EAAAR,IAEAhC,EAAAC,EAAA+B,IAGA/B,EAAAD,EAAAC,EAAA+B,GACA4B,EAAAV,EAAAjD,GACAkD,EAAAS,EAAA,GACA3D,EAAA2D,EAAA,GACAT,IACAQ,EAAAd,EAAAM,MAMAU,EAAAV,EAAAA,EAAA,IAAAlD,EAAAA,EACA6D,EAAA7D,EACA8D,GAAAZ,EACAa,EAAAL,IAUAJ,GACA/D,QAAA,SAAAS,GACA,MAAA8B,GAAA9B,IAEAgE,QAAA,SAAAhE,GACA,GAAAiE,GAAAtB,EAAA3C,EACA,YAAA,KAAAiE,EACAA,EAEAtB,EAAA3C,OAGAkE,OAAA,SAAAlE,GACA,OACAmE,GAAAnE,EACAoE,IAAA,GACAJ,QAAArB,EAAA3C,GACAgB,OAAAoC,EAAApD,MAKA+C,EAAA,SAAA/C,EAAAqE,EAAAC,EAAAvC,GACA,GAAAwC,GAAA9B,EAAA+B,EAAAzD,EAAAL,EAGA+D,EAFAxC,KACAyC,QAAAJ,EAOA,IAHAvC,EAAAA,GAAA/B,EAGA,cAAA0E,GAAA,aAAAA,EAAA,CAKA,IADAL,GAAAA,EAAAlD,QAAAmD,EAAAnD,QAAA,UAAA,UAAA,UAAAkD,EACA3D,EAAA,EAAAA,EAAA2D,EAAAlD,OAAAT,GAAA,EAKA,GAJAK,EAAAsC,EAAAgB,EAAA3D,GAAAqB,GAIA,aAHAU,EAAA1B,EAAA6C,GAIA3B,EAAAvB,GAAA4C,EAAA/D,QAAAS,OACA,IAAA,YAAAyC,EAEAR,EAAAvB,GAAA4C,EAAAU,QAAAhE,GACAyE,GAAA,MACA,IAAA,WAAAhC,EAEA8B,EAAAtC,EAAAvB,GAAA4C,EAAAY,OAAAlE,OACA,IAAAN,EAAAiD,EAAAF,IACA/C,EAAAmD,EAAAJ,IACA/C,EAAAoD,EAAAL,GACAR,EAAAvB,GAAAkC,EAAAH,OACA,CAAA,IAAA1B,EAAAgD,EAIA,KAAA,IAAAf,OAAAhD,EAAA,YAAAyC,EAHA1B,GAAAgD,EAAAY,KAAA5D,EAAA8C,EAAA/B,EAAAC,GAAA,GAAAS,EAAAC,OACAR,EAAAvB,GAAAiC,EAAAF,GAMA+B,EAAAF,EAAAA,EAAAhC,MAAAK,EAAA3C,GAAAiC,OAAA2C,GAEA5E,IAIAuE,GAAAA,EAAAP,UAAAvE,GACA8E,EAAAP,UAAArB,EAAA3C,GACA2C,EAAA3C,GAAAuE,EAAAP,QACAQ,IAAA/E,GAAAgF,IAEA9B,EAAA3C,GAAAwE,QAGAxE,KAGA2C,EAAA3C,GAAAsE,IAIAhF,EAAAC,EAAA8C,EAAA,SAAAgC,EAAAC,EAAAvC,EAAAC,EAAA6C,GACA,GAAA,gBAAAR,GACA,MAAAf,GAAAe,GAEAf,EAAAe,GAAAC,GAMA1B,EAAAS,EAAAgB,EAAAC,GAAAV,EACA,KAAAS,EAAA3C,OAAA,CAMA,GAJAV,EAAAqD,EACArD,EAAAqD,MACAhC,EAAArB,EAAAqD,KAAArD,EAAAsD,WAEAA,EACA,MAGAA,GAAA5C,QAGA2C,EAAAC,EACAA,EAAAvC,EACAA,EAAA,MAEAsC,EAAA5E,EA6BA,MAxBA6E,GAAAA,GAAA,aAIA,kBAAAvC,KACAA,EAAAC,EACAA,EAAA6C,GAIA7C,EACAe,EAAAtD,EAAA4E,EAAAC,EAAAvC,GAQA+C,WAAA,WACA/B,EAAAtD,EAAA4E,EAAAC,EAAAvC,IACA,GAGAM,GAOAA,EAAArB,OAAA,SAAA+D,GACA,MAAA1C,GAAA0C,IAMAzF,EAAA0F,SAAArC,EAEAnD,EAAA,SAAAQ,EAAAqE,EAAAC,GACA,GAAA,gBAAAtE,GACA,KAAA,IAAAgD,OAAA,4DAIAqB,GAAA3C,SAIA4C,EAAAD,EACAA,MAGA3E,EAAAiD,EAAA3C,IAAAN,EAAAmD,EAAA7C,KACA6C,EAAA7C,IAAAA,EAAAqE,EAAAC,KAIA9E,EAAAyF,KACAC,QAAA,MAIA1F,EAAA,gBAAA,cCvaAA,EAAA,wBAAA,WA2HA,MA1HA2F,YAAAC,SAAAC,QACAC,QAAA,MACAC,SAAA,yBAEAC,WAAA,WAEAC,KAAAC,SAAAC,EAAAC,QAAA,OAAA,uBAAAH,KAAAI,QAEAJ,KAAAK,MAAAC,GAAA,SAAAN,KAAAI,OAAAJ,OASAO,SAAA,WACAP,KAAAQ,IAAAR,KAAAQ,IAAAC,WACAT,KAAAQ,IAAAE,SACAV,KAAAW,WAAAX,KAAAQ,MAIAI,QACAC,UAAA,gBAYAC,aAAA,SAAAtC,GACA0B,EAAAC,QAAA,OAAAY,QAAA,aAAAvC,EAAAwB,KAAAK,QASAW,gBAAA,WACA,OAOAC,gBAAA,WACA,MAAAjB,MAAAkB,UACA,0BAAAlB,KAAAkB,UAAA,YAEA,IASAC,cAAA,WACA,GAAAC,GAAApB,KAAAoB,OAKA,OAJAlB,GAAAC,QAAA,OAAAkB,QAAA,qBACAC,IAAA,OAAAtB,KAAAtB,KACA0C,GAAA,WAEAA,GAQAG,UAAA,WACA,GAAA,IAAAvB,KAAAwB,IAAA,CACA,GAAAC,GAAAvB,EAAAC,QAAA,OAAAkB,QAAA,gBACA,OAAArB,MAAAwB,IAAAC,EAAAH,IAAA,MAEA,MAAA,KASAI,aAAA,WACA,MAAA,IAAA1B,KAAAwB,IACA,SAEA,SAUAG,eAAA,WACA,MAAA3B,MAAA4B,SACA,WAEA,UCnHA7H,EAAA,kBAAA,sBAAA,SAAA8H,GAgBA,MAfAnC,YAAAoC,eAAAlC,QACAC,QAAA,MACAkC,UAAAF,EAQAG,OAAA,WACAvC,OAAAO,KAAAiC,IAAAC,KAAA,WAAAxB,cCZA3G,EAAA,2BAAA,WAqHA,MApHA2F,YAAAC,SAAAC,QACAC,QAAA,OACAC,SAAA,oCAEAC,WAAA,WAEAC,KAAAC,SAAAC,EAAAC,QAAA,OAAA,eAAAH,KAAAI,OAAAJ,MACAA,KAAAC,SAAAC,EAAAC,QAAA,OAAA,iBAAAH,KAAAI,OAAAJ,MAEAA,KAAAC,SAAAC,EAAAC,QAAA,OAAA,oBAAAH,KAAAmC,WAAAnC,OASAgB,gBAAA,WACA,GAAAoB,GAAApC,IACA,QAQAqC,cAAA,WAMA,GALAD,EAAAE,aACAtC,KAAAsC,aAAA,gBAAAF,EAAAE,aAAA,iBAEAtC,KAAAsC,aAAA,GAEApC,EAAAC,QAAA,OAAAkB,QAAA,cAAA,WACA,GAAAvB,GAAAI,EAAAC,QAAA,OAAAkB,QAAA,eAAA,2CAEA,IAAAvB,GAAAI,EAAAC,QAAA,OAAAkB,QAAA,eAAA,qCAEA,OAAAvB,GAAAE,OASAuC,cAAA,WACA,MAAArC,GAAAC,QAAA,OAAAkB,QAAA,cAAA,SACA,WAEA,IASAmB,kBAAA,WACA,MAAAtC,GAAAC,QAAA,OAAAkB,QAAA,cAAA,SAIA,GAHAnB,EAAAC,QAAA,OAAAkB,QAAA,eAAA,oCACArB,SAQAgC,OAAA,WACAvC,OAAAO,KAAAiC,IAAAC,KAAA,aAQAtB,QACA6B,iBAAA,eACAC,qBAAA,oBAWAC,aAAA,SAAAnE,GACA0B,EAAAC,QAAA,OAAAY,QAAA,gBAAAvC,IAWAoE,iBAAA,SAAApE,GACA0B,EAAAC,QAAA,OAAAY,QAAA,oBAAAvC,IAGA2D,WAAA,SAAAU,GACApD,OAAAO,KAAAiC,IAAAC,KAAA,qBAAAY,OAAA,UAAAC,MAAA,GAAA,UChHAhJ,EAAA,gCAAA,WAyDA,MAxDA2F,YAAAC,SAAAC,QACAC,QAAA,OACAC,SAAA,8BAEAC,WAAA,WAEAC,KAAAC,SAAAC,EAAAC,QAAA,OAAA,eAAAH,KAAAI,OAAAJ,OASAgB,gBAAA,WAEA,OAOAuB,cAAA,WACA,MAAArC,GAAAC,QAAA,OAAAkB,QAAA,cAAA,SACA,WAEA,MAUAT,QACAoC,wBAAA,mBAWAC,gBAAA,SAAAzE,GACA,GAAA0E,GAAAhD,EAAAC,QAAA,OAAAkB,QAAA,gBACA5B,QAAAyD,GAAAC,YAAA,uBCrDApJ,EAAA,oBAAA,iBAAA,wBAAA,8BAAA,SAAAqJ,EAAAC,EAAAC,GAsCA,MArCA5D,YAAA6D,WAAA3D,QACAC,QAAA,MACAC,SAAA,sBAEA0D,SAEAC,KAAA,eAEAC,QAAA,kBACAC,iBAAA,0BASApD,SAAA,WAEA,GAAAqD,GAAA1D,EAAAC,QAAA,OAAAkB,QAAA,uBAEArB,MAAAyD,KAAAI,KAAA,GAAAT,IAAAU,WAAAF,KACA5D,KAAA0D,QAAAG,KAAA,GAAAR,IACArD,KAAA2D,iBAAAE,KAAA,GAAAP,KAGA1C,QACAmD,iBAAA,aAGAC,UAAA,SAAAxF,SChCAzE,EAAA,yBAAA,WAMA,MALA2F,YAAAC,SAAAC,QACAC,QAAA,MACAC,SAAA,0BCCA/F,EAAA,2BAAA,mBAAA,uBAAA,SAAAkK,EAAAC,GAmCA,MAjCAxE,YAAA6D,WAAA3D,QACAC,QAAA,MACAC,SAAA,kBAEA0D,SACAW,IAAA,iBACAC,UAAA,qBACAC,OAAA,sBAGAtE,WAAA,WACAC,KAAAC,SAAAC,EAAAC,QAAA,OAAA,uBAAAH,KAAAsE,kBAGAtC,OAAA,WACAhC,KAAAmE,IAAAN,KAAA,GAAAI,GAEA,IAAAM,GAAArE,EAAAC,QAAA,OAAAkB,QAAA,iBACAmD,EAAAD,EAAAjD,IAAA,YAEAmD,EAAAvE,EAAAC,QAAA,SAAAkB,QAAA,gBACArB,MAAAoE,UAAAP,KAAA,GAAAY,IAAApE,MAAAmE,KAEAxE,KAAAsE,mBAGAA,gBAAA,WACA,GAAAI,GAAAxE,EAAAC,QAAA,OAAAkB,QAAA,qBACAsD,EAAAD,EAAApD,IAAA,oBAAAjH,KAAAqK,EACA1E,MAAAqE,OAAAR,KAAAc,QC9BA5K,EAAA,oBAAA,WA8IA,MA5IA2F,YAAA6D,WAAA3D,QACAC,QAAA,MACAC,SAAA,gBACA8E,UAAA,eACAC,WAAA,EAEAC,aAAA,EACAC,YAAA,EAEAvB,SACAwB,WAAA,uBACAC,KAAA,gBACAC,YAAA,yBAGAnF,WAAA,WACAC,KAAAC,SAAAC,EAAAC,QAAA,OAAA,uBAAAH,KAAAI,QACAF,EAAAC,QAAA,OAAAgF,MAAA,aAAAnF,KAAAoF,UAAApF,MAKAP,OAAA4F,QAAA/E,GAAA,UAAAgF,QAAAtF,MAAAA,KAAAuF,mBACAvF,KAAAC,SAAAC,EAAAC,QAAA,UAAA,cAAAH,KAAAwF,wBACAxF,KAAAC,SAAAC,EAAAC,QAAA,UAAA,SAAAH,KAAAyF,qBACAzF,KAAAC,SAAAC,EAAAC,QAAA,UAAA,eAAAH,KAAAwF,wBACAxF,KAAAC,SAAAC,EAAAC,QAAA,UAAA,SAAAH,KAAAyF,qBAEAzF,KAAAC,SAAAC,EAAAC,QAAA,OAAA,uBAAA,WAEAd,WAAA,WACAa,EAAAC,QAAA,OAAAkB,QAAA,mBACA,IAAArB,OACAA,MAMAE,EAAAC,QAAA,OAAAgF,MAAA,iBAAAnF,KAAA0F,cAAA1F,OAGAgC,OAAA,WACA9B,EAAAC,QAAA,QAAAY,QAAA,YAAAf,OAGAO,SAAA,WACA,GAAAmE,GAAAxE,EAAAC,QAAA,OAAAkB,QAAA,qBACAsE,EAAAjB,EAAApD,IAAA,sBAAAjH,KAAAqK,EACA1E,MAAAiF,KAAApB,KAAA8B,EAEA,IAAAC,GAAAlB,EAAApD,IAAA,qBAAAjH,KAAAqK,EACA1E,MAAAgF,WAAAnB,KAAA+B,EAEA,IAAAC,GAAAnB,EAAApD,IAAA,sBAAAjH,KAAAqK,EACA1E,MAAAkF,YAAArB,KAAAgC,GAEA3F,EAAAC,QAAA,QAAAY,QAAA,gBAGAqE,UAAA,WACA,MAAA3F,QAAAO,KAAAiC,IAAA6D,UAGAC,SAAA,WACA/F,KAAAgG,uBAGAC,gBAAA,WACAxG,OAAA4F,QAAAa,IAAA,SAAAlG,KAAAmG,SAGAH,oBAAA,WACAhG,KAAAoG,aAAApG,KAAAgF,WAAA/C,IACAjC,KAAAoG,aAAApG,KAAAkF,YAAAjD,IACAjC,KAAAyF,oBAAAzF,OAGAuF,kBAAA,SAAA/G,GACA,GAAA8G,GAAA,EAAA9G,EAAA6H,KAAAf,QAAAtF,KAEAsG,EAAAhB,EAAAN,WAAA/C,GACAsE,EAAAjB,EAAAJ,YAAAjD,EAEAqD,GAAAc,aAAAE,EAAAhB,GACAA,EAAAc,aAAAG,EAAAjB,GAEAA,EAAAE,uBAAAF,GAKAkB,aAAAlB,EAAAT,WAIAS,EAAAT,UAAAxF,WAAAiG,EAAAG,oBAAA,IAAAH,IAGAc,aAAA,SAAAnE,EAAAqD,GACA,GAAAmB,GAAAhH,OAAAwC,GAAAyE,SAAAD,IACAE,EAAAlH,OAAA4F,QAAAuB,SACAA,EAAAD,EAAAF,CACAhH,QAAAwC,GAAA2E,OAAAA,IAGAnB,oBAAA,SAAAH,GACAA,EAAAA,GAAAtF,IAEA,IAAA+E,GAAAtF,OAAA6F,EAAAN,WAAA/C,IAAAyE,SACAG,EAAA9B,EAAA0B,IACAK,EAAA/B,EAAAgC,IAEAtH,QAAA6F,EAAAN,WAAA/C,IAAA+E,KAAAC,SAAA,QAAAF,KAAAD,EAAAL,IAAAI,GAAA,IAAA9B,GAAAtF,OAAA6F,EAAAN,WAAA/C,IAAAyE,SAEA5B,EAAArF,OAAA6F,EAAAJ,YAAAjD,IAAAyE,SACAQ,EAAApC,EAAA2B,IACAU,EAAArC,EAAAiC,IAEAtH,QAAA6F,EAAAJ,YAAAjD,IAAA+E,KAAAC,SAAA,QAAAF,KAAAI,EAAAV,IAAAS,KAGA1B,uBAAA,SAAAF,GACAA,EAAAA,GAAAtF,IAEA,IAGAoH,IAHA3H,OAAA6F,EAAAN,WAAA/C,IAAAyE,SACAjH,OAAA6F,EAAAJ,YAAAjD,IAAAyE,SAEAjH,OAAA,YAAA2H,YAEA3H,QAAA6F,EAAAN,WAAA/C,IAAA+E,KAAAC,SAAA,WAAAF,KAAA,EAAAN,IAAAW,IACA3H,OAAA6F,EAAAJ,YAAAjD,IAAA+E,KAAAC,SAAA,WAAAR,IAAAW,EAAAC,MAAA,EAAAN,KAAA,UAGArB,cAAA,WACA1F,KAAAuF,yBC9IAxL,EAAA,8BAAA,WAmHA,MAlHA2F,YAAAC,SAAAC,QACAC,QAAA,MACAC,SAAA,4BAQAS,SAAA,WACAP,KAAAQ,IAAAR,KAAAQ,IAAAC,WACAT,KAAAQ,IAAAE,SACAV,KAAAW,WAAAX,KAAAQ,MAIAI,QACAC,UAAA,gBAYAC,aAAA,SAAAtC,GACA0B,EAAAC,QAAA,OAAAY,QAAA,aAAAvC,EAAAwB,KAAAK,QASAW,gBAAA,WACA,OAOAC,gBAAA,WACA,MAAAjB,MAAAsH,eACA,0BAAAtH,KAAAsH,eAAA,YAEA,IASAnG,cAAA,WACA,GAAAC,GAAApB,KAAAoB,OAKA,OAJAlB,GAAAC,QAAA,OAAAkB,QAAA,qBACAC,IAAA,OAAAtB,KAAAtB,KACA0C,GAAA,WAEAA,GAQAG,UAAA,WACA,GAAA,IAAAvB,KAAAwB,IAAA,CACA,GAAAC,GAAAvB,EAAAC,QAAA,OAAAkB,QAAA,gBACA,OAAArB,MAAAwB,IAAAC,EAAAH,IAAA,MAEA,MAAA,KASAI,aAAA,WACA,MAAA,IAAA1B,KAAAwB,IACA,SAEA,SAUAG,eAAA,WACA,MAAA3B,MAAA4B,SACA,WAEA,UC5GA7H,EAAA,wBAAA,4BAAA,SAAAwN,GAoDA,MAnDA7H,YAAA8H,cAAA5H,QACAC,QAAA,MACAC,SAAA,uBACAiC,UAAAwF,EAEAxH,WAAA,WAEAC,KAAAC,SAAAC,EAAAC,QAAA,OAAA,eAAAH,KAAAI,OAAAJ,OAGAyH,WAAA,SAAAC,EAAA3F,GACAtC,OAAAiI,EAAAzF,IAAAC,KAAA,cAAAyF,OAAA5F,EAAAE,KAGAjB,gBAAA,WACA,OAOAuB,cAAA,WACA,MAAArC,GAAAC,QAAA,OAAAkB,QAAA,cAAA,SACA,WAEA,MAMAT,QACAgH,oBAAA,gBAWAjF,aAAA,SAAAnE,GACA0B,EAAAC,QAAA,OAAAY,QAAA,gBAAAvC,EACA,IAAA0E,GAAAhD,EAAAC,QAAA,OAAAkB,QAAA,gBACA5B,QAAAyD,GAAAC,YAAA,uBC/CApJ,EAAA,mCAAA,WAMA,MALA2F,YAAAC,SAAAC,QACAC,QAAA,MACAC,SAAA,qBCJA/F,EAAA,oBAAA,iCAAA,SAAA8N,GAqDA,MAnDAnI,YAAA6D,WAAA3D,QACAE,SAAA,kBAEA0D,SACAsE,OAAA,oBACAC,QAAA,qBACAC,OAAA,qBAGAjI,WAAA,WACAG,EAAAC,QAAA,OAAAgF,MAAA,eAAAnF,KAAAiI,MAAAjI,MACAE,EAAAC,QAAA,UAAAgF,MAAA,qBAAAnF,KAAAkI,YAAAlI,MACAE,EAAAC,QAAA,UAAAgF,MAAA,sBAAAnF,KAAAmI,aAAAnI,OAGAgC,OAAA,WACAvC,OAAAO,KAAAiC,IAAA6D,SAAAsC,oBAGAF,YAAA,SAAAG,EAAAhC,GACA,GAAAiC,GAAApI,EAAAC,QAAA,OAAAkB,QAAA,aAAAgH,GACAE,EAAAD,EAAAhH,IAAA,kBAAAjH,KAAAiO,EAAAjC,GACAmC,EAAAF,EAAAhH,IAAA,iBAAAjH,KAAAiO,EAAAjC,GACAoC,EAAAH,EAAAhH,IAAA,iBAAAjH,KAAAiO,EAAAjC,EAEArG,MAAA8H,OAAAjE,KAAA2E,GACAxI,KAAA+H,QAAAlE,KAAA0E,GACAvI,KAAAgI,OAAAnE,KAAA4E,IAIAN,aAAA,WACAnI,KAAA8H,OAAAY,QACA1I,KAAA+H,QAAAW,QACA1I,KAAAgI,OAAAU,SAGAT,MAAA,WACA,MAAAxI,QAAAO,KAAAiC,IAAA6D,UAGAlF,QACA+H,0BAAA,qBAGAC,kBAAA,WACA1I,EAAAC,QAAA,OAAAY,QAAA,+BChDAhH,EAAA,mCAAA,WAiCA,MAhCA2F,YAAAC,SAAAC,QACAC,QAAA,KAEAC,SAAA,2BAEAmG,gBAAA,WACAjG,KAAAK,MAAA6F,IAAA,gBAAAlG,KAAAI,SAGAL,WAAA,WACAC,KAAAK,MAAAC,GAAA,gBAAAN,KAAAI,OAAAJ,OAGAY,QACAC,UAAA,YAGAgI,SAAA,SAAArK,GACA0B,EAAAC,QAAA,aAAAY,QAAA,iBAAAvC,EAAAwB,KAAAK,QAGAW,gBAAA,WACA,OACAG,cAAA,WACA,GAAAnB,KAAA8I,OACA,MAAA,gBC1BA/O,EAAA,qCAAA,iCAAA,SAAAgP,GAiCA,MAhCArJ,YAAA8H,cAAA5H,QACAC,QAAA,MACAkC,UAAAgH,EACAjJ,SAAA,8BAEAC,WAAA,WACAC,KAAA8D,WAAA9D,KAAAK,MAAAiB,IAAA,QACAtB,KAAAK,MAAAC,GAAA,SAAAN,KAAAI,OAAAJ,MACAA,KAAAK,MAAAiB,IAAA,OAMA2E,gBAAA,WAEA,GADAjG,KAAAK,MAAA6F,IAAA,SAAAlG,KAAAI,QACA,UAAAJ,KAAAK,MAAAiB,IAAA,MAAA,CACApB,EAAAC,QAAA,UAAAkB,QAAA,kBACA6E,IAAA,MAAAlG,KAAAgJ,aAAAhJ,QAIAyH,WAAA,SAAAC,EAAA3F,GACAtC,OAAAiI,EAAAzF,IAAAC,KAAA,eAAAyF,OAAA5F,EAAAE,KAGA+G,aAAA,WACA,GAAAC,GAAA/I,EAAAC,QAAA,UAAAkB,QAAA,iBACArB,MAAAK,MAAA6I,IAAA,OAAAD,QC7BAlP,EAAA,8BAAA,WAQA,MAPAoP,UAAAC,MAAAxJ,QACAyJ,UACAP,QAAA,EACAQ,SAAA,OCJAvP,EAAA,iCAAA,4BAAA,SAAAwP,GAIA,MAHAJ,UAAAK,WAAA5J,QACAS,MAAAkJ,MCFAxP,EAAA,qCAAA,oCAAA,iCAAA,SAAA0P,EAAAC,GAmDA,MAlDAhK,YAAAoC,eAAAlC,QACAC,QAAA,MACAC,SAAA,8BACAiC,UAAA0H,EAEA1J,WAAA,WACAG,EAAAC,QAAA,aAAAgF,MAAA,WAAAnF,KAAA2J,iBAAA3J,OAGA4J,SAAA,SAAAC,GACA,GAAAC,GAAA5J,EAAAC,QAAA,aAAAkB,QAAA,kBACA0I,EAAAD,EAAAE,OAAAC,eAAA,GAMA,IAAA,WADA/J,EAAAC,QAAA,OAAAkB,QAAA,qBACAC,IAAA,MAAA,CACA,GAAA4I,GAAAJ,EAAAE,OAAAtL,GAAA,SACAqL,GAAAA,EAAA/N,OAAAkO,GAGAlK,KAAA8D,WAAA,GAAA4F,GAAAK,EACA,IAAA3H,GAAApC,KACAmK,EAAAN,EAAAvI,IAAA,iBACA,iBAAA6I,SACA,KAAAA,EAAAb,SACAc,EAAAC,KAAAF,EAAAb,QAAA,SAAAA,GACAlH,EAAA0B,WAAAwG,OAAAhB,SAIA,KAAAa,EAAAI,SACAH,EAAAC,KAAAP,EAAAU,OAAA,SAAAC,IACA,GAAAN,EAAAI,QAAApO,QAAAsO,EAAAnJ,IAAA,QAEAc,EAAA0B,WAAA4G,IAAAD,MAMAzK,KAAAI,UAGAuJ,iBAAA,WACA,MAAA3J,WCzCAjG,EAAA,qBAAA,0BAAA,iBAAA,uBAAA,mBAAA,qCAAA,SAAAyO,EAAAmC,EAAAC,EAAAC,EAAAC,GA0FA,MAzFApL,YAAA6D,WAAA3D,QACAE,SAAA,mBACAmC,GAAA,cAEAuB,SACAsE,OAAA,aACAxK,KAAA,WACAyN,WAAA,kBACAzC,OAAA,aACA0C,iBAAA,uBAGAjL,WAAA,WAEAG,EAAAC,QAAA,OAAAgF,MAAA,gBAAAnF,KAAAiL,aAAAjL,MAEAE,EAAAC,QAAA,OAAAgF,MAAA,kBAAAnF,KAAAkL,eAAAlL,MAEAA,KAAAI,QACA,IAAA+K,GAAAjL,EAAAC,QAAA,aAAAkB,QAAA,kBACA+J,EAAAD,EAAAE,OACArL,MAAAgL,iBAAAnH,KAAA,GAAAiH,IAAAhH,WAAAsH,KAEApL,KAAA8H,OAAAjE,KAAA,GAAA2E,IAEAxI,KAAA1C,KAAAuG,KAAA,GAAA8G,GAEA,IAAA/G,GAAA1D,EAAAC,QAAA,OAAAkB,QAAA,uBACArB,MAAA+K,WAAAlH,KAAA,GAAA+G,IAAA9G,WAAAF,KAEA5D,KAAAsI,OAAAzE,KAAA,GAAAgH,KAKAtK,SAAA,aAIA0K,aAAA,WACA,MAAAjL,MAAAiC,IAGAiJ,eAAA,WACA,MAAAlL,OAIAY,QACA0K,wBAAA,aACAC,0BAAA,eACAC,yBAAA,eAWAC,WAAA,SAAAjN,GACA0B,EAAAC,QAAA,OAAAY,QAAA,mBAAAvC,IASAkN,YAAA,WACAxL,EAAAC,QAAA,OAAAY,QAAA,sBAUA4K,aAAA,SAAAnN,GACA0B,EAAAC,QAAA,OAAAY,QAAA,aAAAvC,QClGAzE,EAAA,4BAAA,WACA,MAAA2F,YAAA5B,OAAA8B,QACAG,WAAA,WACAC,KAAAC,SAAAC,EAAAC,QAAA,WAAA,SAAAH,KAAA4L,cAGAA,YAAA,SAAAvL,EAAAwL,GAEA,GAAA5L,GAAAI,EAAAiB,IAAA,UAAAwK,MAGA9L,MAAAC,SAAAC,EAAAC,QAAA,gBAAAF,GAAA,iBAAAD,KAAA+L,eACA/L,KAAAC,SAAAC,EAAAC,QAAA,iBAAAF,GAAA,iBAAAD,KAAA+L,eAEA/L,KAAAC,SAAAC,EAAAC,QAAA,gBAAAE,EAAAiB,IAAA,SAAA,cAAAtB,KAAAgM,YAEA3L,EAAAJ,SAAAC,EAAAC,QAAA,kBAAA,aAAAH,KAAAiM,UAAA5L,GAGAH,EAAAC,QAAA,kBAAAY,QAAA,aAAA8K,IAGAG,WAAA,SAAAxN,EAAAqL,EAAAgC,EAAAK,GACAzM,OAAAjB,EAAA2N,YAAAC,SAAA,QACAlM,EAAAC,QAAA,kBAAAY,QAAA,aAAA8K,IAGAE,cAAA,SAAAF,EAAAhC,GACA3J,EAAAC,QAAA,kBAAAY,QAAA,aAAA8K,IAGAI,UAAA,SAAAJ,GAEA,GAAAQ,GAAArM,KAAAsB,IAAA,UAEA+E,GACAiG,YAAAT,EAAAvK,IAAA+K,EAAAP,QACAS,OAAAF,EAAAE,OACAC,SAAAH,EAAA,SAAAA,EAAAG,SAAAC,QAAAC,WAIAtK,EAAApC,IACAP,QAAAkN,KAAAC,QAAAvG,EAAA,SAAAwG,GACA,GAAAA,GAAAC,KAAAC,MAAAF,EAEA,YAAAzK,EAAAd,IAAA,SACAuK,EAAA3C,IAAA9G,EAAAd,IAAA,QAAAuL,EAAA5P,OAGA,UAAAmF,EAAAd,IAAA,UACAc,EAAA8G,IAAA,UAAA2D,EAAAG,SACA5K,EAAArB,QAAA,oBC7CAhH,EAAA,4BAAA,WA8RA,MA7RA2F,YAAA5B,OAAA8B,QACAG,WAAA,WAEAC,KAAAC,SAAAC,EAAAC,QAAA,OAAA,mBAAAH,KAAAiN,iBACAjN,KAAAC,SAAAC,EAAAC,QAAA,OAAA,oBAAAH,KAAA0L,aACA1L,KAAAC,SAAAC,EAAAC,QAAA,OAAA,yBAAAH,KAAAkN,kBAGAhN,EAAAC,QAAA,OAAAgF,MAAA,cAAAnF,KAAAyL,WAAAzL,MACAE,EAAAC,QAAA,OAAAgF,MAAA,eAAAnF,KAAA0L,YAAA1L,MAMAE,EAAAC,QAAA,UAAAgF,MAAA,qBAAAnF,KAAAmN,mBAAAnN,MAGAE,EAAAC,QAAA,UAAAgF,MAAA,gBAAAnF,KAAAoN,aAAApN,MAEAE,EAAAC,QAAA,UAAAgF,MAAA,eAAAnF,KAAAqN,YAAArN,MAEAE,EAAAC,QAAA,UAAAgF,MAAA,mBAAAnF,KAAAsN,kBAAAtN,MAMAA,KAAAuN,mBAMAvN,KAAAC,SAAAC,EAAAC,QAAA,UAAA,iBAAAH,KAAAwN,gBAQA9B,YAAA,WAEA,GAAA+B,GAAAvN,EAAAC,QAAA,OAAAkB,QAAA,oBACA,KAAAoM,GAAAzN,KAAAsN,oBACA,OAAA,CAIApN,GAAAC,QAAA,UAAAsN,EAAAnM,IAAA,OAAAP,QAAA,sBAKAb,EAAAC,QAAA,UAAAY,QAAA,sBACAb,EAAAC,QAAA,UAAAY,QAAA,gBAEAb,EAAAC,QAAA,UAAAkB,QAAA,sBAGA,IAAA6B,GAAAhD,EAAAC,QAAA,OAAAkB,QAAA,gBACA5B,QAAAyD,GAAAkJ,SAAA,oBAAAsB,YAAA,oBACAjO,OAAAyD,GAAAwK,YAAA,eAGA,IAAAC,GAAA3N,KAAAmN,qBAGAS,EAAA1N,EAAAC,QAAA,OAAAkB,QAAA,eACA5B,QAAAmO,GAAA5G,KAAAK,MAAAsG,GAGA,IAAAvL,GAAApC,IAUAA,MAAA6N,oBAAAC,YAAA,WACAH,GAAAlO,OAAAmO,GAAA5G,IAAA,WACA+G,cAAA3L,EAAAyL,qBACA3N,EAAAC,QAAA,OAAAkB,QAAA,wBAAA,GACAnB,EAAAC,QAAA,UAAAY,QAAA,UAIAtB,OAAA,sBAAAuH,IAAA,UAAA,MAGA,MASAiG,gBAAA,SAAAzO,GACA,GAAA6J,GAAA5I,OAAAjB,EAAAwP,QAAA3H,KAAA,WACArG,MAAAyL,WAAApD,IAWAoD,WAAA,SAAApD,EAAAhC,GACA,GAAArG,KAAAsN,oBACA,OAAA,CAWA,IAPAjH,EAAAA,UAOA,KAAAA,EAAAhG,MAAA,CACA,GAAAqE,GAAAxE,EAAAC,QAAA,OAAAkB,QAAA,qBACA4M,EAAAvJ,EAAApD,IAAA,KACApB,GAAAC,QAAA8N,GAAA5M,QAAA,oBACAgF,EAAAhG,MAAA6I,IAAA,cAAA,GACAlJ,KAAA6L,UAAAxF,EAAAhG,MAIAH,EAAAC,QAAA,UAAAkB,QAAA,qBAAAgH,EAAAhC,GACAnG,EAAAC,QAAA,UAAAY,QAAA,cAGA,IAAAmC,GAAAhD,EAAAC,QAAA,OAAAkB,QAAA,gBACA5B,QAAAyD,GAAAkJ,SAAA,oBAAAsB,YAAA,mBAGA,IAAAE,GAAA1N,EAAAC,QAAA,OAAAkB,QAAA,eACA5B,QAAAmO,GAAA5G,KAAAK,MAAA,OAGA,IAAAjF,GAAApC,IAWAA,MAAAkO,UAAA,EAKAzO,OAAA,sBAAAuH,IAAA,UAAA,GAEAhH,KAAAmO,mBAAAL,YAAA,WACA,OAAArO,OAAAmO,GAAA5G,IAAA,WACA+G,cAAA3L,EAAA+L,oBACA/L,EAAA8L,WACA9L,EAAAgM,cACAhM,EAAA8L,UAAA,EACAhO,EAAAC,QAAA,OAAAkB,QAAA,uBAAAgH,GACA5I,OAAAmO,GAAAxG,UAAA,GACAlH,EAAAC,QAAA,UAAAY,QAAA,aAGA,MAQAmM,iBAAA,WAEA,GAAAU,GAAA1N,EAAAC,QAAA,OAAAkB,QAAA,eAEA5B,QAAAmO,GAAAzK,YAAA,qBAQAiL,YAAA,WAEA,GAAAC,GAAAnO,EAAAC,QAAA,UAAAkB,QAAA,eAEA5B,QAAA4O,GAAAC,SAaAnB,mBAAA,WACA,GAAAjK,GAAAhD,EAAAC,QAAA,OAAAkB,QAAA,gBAEA,OAAA,KADA5B,OAAAyD,GAAAqL,QAAA,KACA,MASAjB,kBAAA,WACA,MAAA,IAAAxP,OAAA0Q,KAAAxO,KAAAuN,iBAAA7R,QAcA0R,aAAA,SAAAqB,GACAzO,KAAAuN,gBAAAkB,IAAA,EAKAzO,KAAA6L,UAAA3C,IAAA,kBAAA,IAUAmE,YAAA,SAAAoB,SACAzO,MAAAuN,gBAAAkB,GAIAzO,KAAAsN,yBAAA,KAAAtN,KAAA6L,WAEA7L,KAAA6L,UAAA3C,IAAA,kBAAA,IAUAsE,cAAA,WACAO,cAAA/N,KAAAmO,qBAGAO,gBAAA,WACA,MAAA1O,MAAAuN,qBCxRAxT,EAAA,oCAAA,WA2HA,MA1HA2F,YAAAC,SAAAC,QACAC,QAAA,MACAC,SAAA,iCAEAC,WAAA,WACAC,KAAAK,OAEAL,KAAAK,MAAAC,GAAA,wBAAAN,KAAAI,OAAAJ,OAUAO,SAAA,WAEAP,KAAAQ,IAAAR,KAAAQ,IAAAC,WACAT,KAAAQ,IAAAE,SACAV,KAAAW,WAAAX,KAAAQ,KAEAN,EAAAC,QAAA,UAAAgF,MAAA,eAAAnF,KAAA2O,YAAA3O,MACAE,EAAAC,QAAA,UAAAgF,MAAA,cAAAnF,KAAA4O,WAAA5O,MACAE,EAAAC,QAAA,UAAAgF,MAAA,eAAAnF,KAAAiI,MAAAjI,OAGAiG,gBAAA,WACAjG,KAAAK,OACAL,KAAAK,MAAA6F,IAAA,wBAAAlG,KAAAI,SAIAQ,QACAiO,mBAAA,oBACAC,mBAAA,eACAC,cAAA,YAWAC,aAAA,SAAAxQ,GACA,GAAAiP,GAAAvN,EAAAC,QAAA,OAAAkB,QAAA,oBACAnB,GAAAC,QAAA,UAAAsN,EAAAnM,IAAA,OAAAP,QAAA,gBAAAvC,EAAAwP,OAAA/Q,MAAAuB,IAUAyQ,kBAAA,SAAAzQ,GACA,IAAAA,EAAA0Q,UACA1Q,EAAA2Q,WAAA,EACAnP,KAAAgP,aAAAxQ,KAYAmQ,YAAA,WACA,GAAAN,GAAA5O,OAAAO,KAAAiC,IAAAC,KAAA,aACA,KAAAzC,OAAA2P,KAAAf,EAAAgB,SACAhB,EAAAgB,IAAA,IACAhB,EAAAtN,QAAA,SACAsN,EAAAC,UAUAM,WAAA,WACAnP,OAAAO,KAAAiC,IAAAC,KAAA,cAAAoN,QASArH,MAAA,WACA,MAAAxI,QAAAO,KAAAiC,IAAAC,KAAA,eAGAqN,SAAA,WACArP,EAAAC,QAAA,UAAAY,QAAA,mBAGAC,gBAAA,WACA,OACAW,eAAA,WAEA,MAAA3B,MAAAwP,eACA,WAEA,UCtHAzV,EAAA,oCAAA,WAMA,MALA2F,YAAAC,SAAAC,QACAC,QAAA,MACAC,SAAA,qBAKA/F,EAAA,0BAAA,iCAAA,kCAAA,SAAA0V,EAAAC,GCHA,MAZAvG,UAAAC,MAAAxJ,QACAyJ,UACAsG,cAAA,SAAAtJ,GACA,MAAA,IAAAoJ,GAAApJ,IAGAuJ,cAAA,SAAAvJ,GACA,MAAA,IAAAqJ,GAAArJ,SCAAtM,EAAA,+BAAA,0BAAA,SAAA8V,GAIA,MAHA1G,UAAAK,WAAA5J,QACAS,MAAAwP,MAIA9V,EAAA,qCAAA,WCMA,MAnBA2F,YAAAC,SAAAC,QACAC,QAAA,MACAC,SAAA,+BAEAS,SAAA,WACAP,KAAAQ,IAAAR,KAAAQ,IAAAC,WACAT,KAAAQ,IAAAE,SACAV,KAAAW,WAAAX,KAAAQ,MAGAI,QACAkP,2BAAA,qBAGAC,kBAAA,SAAA9N,GACA/B,EAAAC,QAAA,mBAAAY,QAAA,0BAAAkB,EAAAjC,KAAAK,YAOAtG,EAAA,sCAAA,WCXA,MAXA2F,YAAAC,SAAAC,QACAC,QAAA,MACAC,SAAA,sCAEAS,SAAA,WACAP,KAAAQ,IAAAR,KAAAQ,IAAAC,WACAT,KAAAQ,IAAAE,SACAV,KAAAW,WAAAX,KAAAQ,UAMAzG,EAAA,yCAAA,kCAAA,oCAAA,SAAAiW,EAAAC,GCmFA,MAhGAvQ,YAAAoC,eAAAlC,QACAC,QAAA,MACAkC,UAAAiO,EACAE,UAAAD,EAEAE,YAAA,0BAEApQ,WAAA,WACAG,EAAAC,QAAA,OAAAgF,MAAA,qBAAAnF,KAAAoQ,kBAAApQ,OAGAgC,OAAA,WAEAhC,KAAAQ,IAAAf,OAAAO,KAAAiC,IAAA6D,SACArG,OAAAO,KAAAQ,KAAA0B,KAAA,cAAAxB,SACAV,KAAAW,WAAAX,KAAAQ,IAIAf,QAAAO,KAAAiC,IAAAoO,UACAC,YAAA,wCACAC,OAAA,QACAC,UAAA,UACAC,KAAA,SAAAjS,EAAAkS,GACAxQ,EAAAC,QAAA,mBAAAY,QAAA,oBAAAvC,EAAAkS,IAGAC,IAAA,SAAAnS,EAAAkS,GACAxQ,EAAAC,QAAA,mBAAAY,QAAA,mBAAA2P,IAGAE,QAAA,SAAApS,EAAAkS,GACAxQ,EAAAC,QAAA,mBAAAY,QAAA,uBAAA2P,IAGAG,OAAA,SAAArS,EAAAkS,GACAxQ,EAAAC,QAAA,UAAAkB,QAAA,iBAGAyP,MAAA,SAAAtS,EAAAkS,GACAxQ,EAAAC,QAAA,mBAAAY,QAAA,qBAAA2P,IAIAK,KAAA,SAAAvS,EAAAkS,GACAxQ,EAAAC,QAAA,mBAAAY,QAAA,oBAAA2P,MAIAjR,OAAAO,KAAAiC,IAAA6D,SAAAkL,WACAC,QAAA,GACAC,kBAAA,2BACAC,SAAA,WACAC,kBAAA,EACAC,MAAA,EAAA,GACAb,UAAA,UAEAD,OAAA,SAAA/R,GACA,GAAA+P,GAAA9O,OAAAjB,EAAAwP,QAAAlI,SAAAyI,QACA3H,EAAAnH,OAAAjB,EAAAwP,QAAAlI,SAAAc,SACA0K,EAAA7R,OAAAjB,EAAAwP,QAAAlI,SAAAuF,QACAtE,EAAAwH,EAAA,EACA9H,EAAAG,EAAA,CAGA,OAFAnH,QAAAO,MAAAgR,UAAA,SAAA,YAAAvK,IAAAA,EAAAM,KAAAA,IACAtH,OAAA6R,GAAAC,OAAA,KACAD,GAGAR,MAAA,SAAAtS,EAAAkS,GACAxQ,EAAAC,QAAA,mBAAAY,QAAA,yBAAAf,KAAA0Q,IAEAK,KAAA,SAAAvS,EAAAkS,GACAxQ,EAAAC,QAAA,mBAAAY,QAAA,wBAAAf,KAAA0Q,OAKAN,kBAAA,WACA,MAAA3Q,QAAAO,KAAAiC,KAGAuP,WAAA,WACA/R,OAAAO,KAAAiC,IAAAmK,SAAApM,KAAAmQ,cAGAsB,cAAA,WACAzR,KAAA0R,mBACAjS,OAAAO,KAAAiC,IAAAyL,YAAA1N,KAAAmQ,cAGAuB,gBAAA,WACA,MAAA,IAAA1R,KAAA8D,WAAApI,YCpFA3B,EAAA,gCAAA,WAIA,MAHAoP,UAAAC,MAAAxJ,aCDA7F,EAAA,mCAAA,8BAAA,SAAA4X,GAKA,MAJAxI,UAAAK,WAAA5J,QACAS,MAAAsR,EACAC,WAAA,YAIA7X,EAAA,qCAAA,WCyGA,MAvHA2F,YAAAC,SAAAC,QACAC,QAAA,MACAC,SAAA,qCAEAC,WAAA,WACAqK,EAAAyH,QAAA7R,KAAA,UACAE,EAAAC,QAAA,UAAAgF,MAAA,kBAAAnF,KAAA8R,eAAA9R,OAGAO,SAAA,WACAP,KAAAQ,IAAAR,KAAAQ,IAAAC,WACAT,KAAAQ,IAAAE,SACAV,KAAAW,WAAAX,KAAAQ,KAEAR,KAAA+R,UAAA,CACA,IAAA3P,GAAApC,IAIAE,GAAAC,QAAA,OAAAkB,QAAA,eACA5B,OAAAO,KAAAiC,IAAAC,KAAA,+BAAA8O,WACAC,QAAA,GACAT,UAAA,UACAU,kBAAA,2BACAE,kBAAA,EACAC,MAAA,EAAA,GACAF,SAAA,cAEAZ,OAAA,SAAA/R,GACA,GAAA+P,GAAA9O,OAAAjB,EAAAwP,QAAAlI,SAAAyI,QACA3H,EAAAnH,OAAAjB,EAAAwP,QAAAlI,SAAAc,SACA0K,EAAA7R,OAAAjB,EAAAwP,QAAAlI,SAAAuF,QACAtE,EAAAwH,EAAA,EACA9H,EAAAG,EAAA,CAGA,OAFAnH,QAAAO,MAAAgR,UAAA,SAAA,YAAAvK,IAAAA,EAAAM,KAAAA,IACAtH,OAAA6R,GAAAC,OAAA,KACAD,GAGAR,MAAA,SAAAtS,EAAAkS,GACAtO,EAAA2P,UAAA,EACA7R,EAAAC,QAAA,mBAAAY,QAAA,iBAAAf,KAAA0Q,IAGAK,KAAA,SAAAvS,EAAAkS,GACAtO,EAAA2P,UAAA,EACA7R,EAAAC,QAAA,mBAAAY,QAAA,gBAAAf,KAAA0Q,IAGAsB,KAAA,SAAAxT,EAAAkS,GACAxQ,EAAAC,QAAA,mBAAAY,QAAA,YAAAf,KAAA0Q,EAAAlS,MAGAyT,mBAEAxS,OAAAO,KAAAiC,IAAAC,KAAA,YAAAoM,MAAA,WACA7O,OAAAO,MAAAoM,SAAA,YACAkD,KAAA,WACA7P,OAAAO,MAAA0N,YAAA,cAKA9M,QACAsR,iBAAA,iBACAC,mBAAA,sBACAC,qBAAA,sBAGAC,eAAA,SAAA7T,GACAwB,KAAA+R,UACA7R,EAAAC,QAAA,UAAAY,QAAA,kBAAAvC,IAIA8T,mBAAA,SAAA9T,GACAiB,OAAAjB,EAAAwP,QAAA5B,SAAA,WACA/M,WAAA,WACAI,OAAAjB,EAAAwP,QAAAN,YAAA,YACA,OAGA6E,oBAAA,SAAA/T,GACA,IAAAA,EAAA0Q,UACAlP,KAAAqS,eAAA7T,GACA0B,EAAAC,QAAA,UAAAkB,QAAA,kBAIAL,gBAAA,WACA,OACAwR,iBAAA,WACA,GAAAC,GAAA,GACArQ,EAAApC,IAQA,OAPAoK,GAAAC,KAAArK,KAAA0S,WAAA,SAAAhU,GACA,GAAAiU,GAAAzS,EAAAC,QAAA,UAAAkB,QAAA,WAAA3C,GACAkU,EAAAD,EAAArR,IAAA,YACAuR,EAAAF,EAAArR,IAAA,QACAwR,EAAA5S,EAAAC,QAAA,OAAAkB,QAAA,eAAA,oCACAoR,IAAAK,GAAApU,GAAAA,EAAAkU,SAAAA,EAAAC,KAAAA,EAAAF,KAAAA,EAAAI,WAAA3Q,EAAA2Q,eAEAN,GAGAM,WAAA,WACA,MAAA/S,MAAA2S,KAAArR,IAAA,cACA,WAEA,MAMAwQ,eAAA,WACA,MAAA9R,MAAAiC,QAOAlI,EAAA,6CAAA,mCAAA,SAAAiZ,GChHA,MAVAtT,YAAAoC,eAAAlC,QACAC,QAAA,MACAkC,UAAAiR,EAEAhR,OAAA,WACAvC,OAAAO,KAAAiC,IAAAC,KAAA,gBAAAxB,SACAR,EAAAC,QAAA,UAAAkB,QAAA,yBAMAtH,EAAA,gCAAA,wCAAA,kCAAA,6CAAA,SAAAkZ,EAAAC,EAAAC,GCoCA,MA/CAzT,YAAA6D,WAAA3D,QACAE,SAAA,oCAEA0D,SACA4P,QAAA,mCACAC,QAAA,qBACAC,UAAA,wBAGAvT,WAAA,WACAC,KAAAC,SAAAC,EAAAC,QAAA,UAAA,oBAAAH,KAAAuT,kBACAvT,KAAAC,SAAAC,EAAAC,QAAA,UAAA,eAAAH,KAAAwT,uBAEAxT,KAAAyT,gBAAAvT,EAAAC,QAAA,UAAAkB,QAAA,mBACArB,KAAA0T,kBAAA1T,KAAAyT,gBAEAzT,KAAA2T,2BAAAzT,EAAAC,QAAA,UAAAkB,QAAA,oBACArB,KAAA4T,oBAAA5T,KAAA2T,4BAIA3R,OAAA,WACA,GAAA6R,GAAA3T,EAAAC,QAAA,UAAAkB,QAAA,cACArB,MAAAoT,QAAAvP,KAAA,GAAAoP,IAAAnP,WAAA+P,KAEA7T,KAAAqT,QAAAxP,KAAA,GAAAsP,IAAArP,WAAA9D,KAAA0T,qBACA1T,KAAAsT,UAAAzP,KAAA,GAAAsP,IAAArP,WAAA9D,KAAA4T,wBAGA3L,MAAA,WACA,MAAAxI,QAAAO,KAAAiC,IAAA6D,UAGAyN,iBAAA,SAAAO,GACA9T,KAAAqT,QAAAU,QACA/T,KAAAsT,UAAAS,QACA/T,KAAA8T,0BAAAA,EACA9T,KAAAqT,QAAAxP,KAAA,GAAAsP,IAAArP,WAAA9D,KAAA8T,8BAGAN,sBAAA,WACAxT,KAAAqT,QAAAxP,KAAA,GAAAsP,IAAArP,WAAA9D,KAAAyT,mBACAzT,KAAAsT,UAAAzP,KAAA,GAAAsP,IAAArP,WAAA9D,KAAA2T,mCAOA5Z,EAAA,4CAAA,WCtCA,MAZA2F,YAAAoC,eAAAlC,QACAC,QAAA,MAEAE,WAAA,SAAAsG,GACArG,KAAAgU,kBAAAnI,UAAAxF,EAAAwF,YAGAoI,aAAA,SAAA5T,GACA,MAAAH,GAAAC,QAAA,OAAAkB,QAAA,uBAAAhB,QAMAtG,EAAA,qCAAA,0CAAA,SAAAma,GC2CA,MAzDAxU,YAAA6D,WAAA3D,QACAC,QAAA,MACAC,SAAA,mDAEA0D,SACA2Q,SAAA,sBAGApU,WAAA,SAAAsG,GACArG,KAAAK,MAAAC,GAAA,SAAAN,KAAAI,OAAAJ,MACAA,KAAA6L,UAAAxF,EAAAwF,WAGA5F,gBAAA,WACAjG,KAAAK,MAAA6F,IAAA,SAAAlG,KAAAI,SAGAG,SAAA,WACAP,KAAAK,MAAAiB,IAAA,WACAtB,KAAAmU,SAAAtQ,KAAA,GAAAqQ,IAAApQ,WAAA9D,KAAAK,MAAAiB,IAAA,YAAAuK,UAAA7L,KAAA6L,aAEA7L,KAAAmU,SAAAzL,QAGAxI,EAAAC,QAAA,UAAAY,QAAA,sBAAAf,OAGAY,QACAwT,gBAAA,oBAGAC,iBAAA,SAAA7V,GACA0B,EAAAC,QAAA,UAAAY,QAAA,2BAAAvC,EAAAwB,KAAAK,QAGAW,gBAAA,WACA,OACAsT,YAAA,WACA,GAAA,IAAAtU,KAAAuU,MAAA,CAEA,MADArU,GAAAC,QAAA,OAAAkB,QAAA,eAAA,oDACArB,MAEA,MAAA,IAIAwU,eAAA,WACA,MAAAxU,MAAAyU,QACA,OAEA,eASA1a,EAAA,+CAAA,qCAAA,SAAA2a,GClDA,MATAhV,YAAAoC,eAAAlC,QACAC,QAAA,MACAkC,UAAA2S,EAEA3U,WAAA,SAAAsG,GACArG,KAAAgU,kBAAAnI,UAAAxF,EAAAwF,gBAMA9R,EAAA,iCAAA,+CAAA,SAAA4a,GCgCA,MA3CAjV,YAAA6D,WAAA3D,QACAC,QAAA,MACAC,SAAA,wCAEA0D,SACAoR,aAAA,oBACAC,cAAA,sBAGA9U,WAAA,SAAAsG,GACArG,KAAA6L,UAAAxF,EAAAhG,MACAL,KAAA8U,gBAAAzO,EAAAyO,iBAGAvU,SAAA,WACA,GAAAmE,GAAAxE,EAAAC,QAAA,OAAAkB,QAAA,qBACA0T,EAAArQ,EAAApD,IAAA,wBAAAjH,KAAAqK,GAAArE,MAAAL,KAAAK,OAEAL,MAAA4U,aAAA/Q,KAAAkR,GACA/U,KAAA6U,cAAAhR,KAAA,GAAA8Q,IAAA7Q,WAAA9D,KAAA8U,gBAAAjJ,UAAA7L,KAAA6L,cAGA7K,gBAAA,WACA,OACAgU,iBAAA,WACA,OAAA,KAAAhV,KAAA2S,KAAA,CAEA,MADAzS,GAAAC,QAAA,OAAAkB,QAAA,eAAA,+CACArB,MAEA,MAAA,IAIAiV,mBAAA,WACA,GAAAvQ,GAAAxE,EAAAC,QAAA,OAAAkB,QAAA,qBACA6T,EAAAxQ,EAAApD,IAAA,KAEA,OADApB,GAAAC,QAAA+U,GAAA7T,QAAA,WAAArB,KAAA2S,MACArR,IAAA,mBC5BAvH,EAAA,yCAAA,WAgCA,MA/BA2F,YAAAC,SAAAC,QACAC,QAAA,MACAC,SAAA;gDAEAC,WAAA,WACAC,KAAAK,OAEAL,KAAAK,MAAAC,GAAA,wBAAAN,KAAAI,OAAAJ,OAIAiG,gBAAA,WACAjG,KAAAK,OACAL,KAAAK,MAAA6F,IAAA,wBAAAlG,KAAAI,SAIAY,gBAAA,WACA,OACAW,eAAA,WAEA,MAAA3B,MAAAwP,eACA,WAEA,UCzBAzV,EAAA,qCAAA,WA0EA,MAzEA2F,YAAAC,SAAAC,QACAC,QAAA,MACAC,SAAA,qCAEAS,SAAA,WAOA,GANAP,KAAAQ,IAAAR,KAAAQ,IAAAC,WACAT,KAAAQ,IAAAE,SACAV,KAAAW,WAAAX,KAAAQ,KAEAf,OAAAO,KAAAiC,IAAAgQ,mBAEA,aAAAjS,KAAAK,MAAAiB,IAAA,WAAA,CACA,GAAAc,GAAApC,IACAP,QAAAO,KAAAiC,IAAA+O,WACAC,QAAA,GACAT,UAAA,YACA2E,QAAA,EACA5E,OAAA,QAEAO,MAAA,SAAAtS,EAAAkS,GACAtO,EAAA2P,UAAA,EACA7R,EAAAC,QAAA,oBAAAY,QAAA,iBAAAf,KAAA0Q,IAGAK,KAAA,SAAAvS,EAAAkS,GACAtO,EAAA2P,UAAA,EACA7R,EAAAC,QAAA,oBAAAY,QAAA,gBAAAf,KAAA0Q,QAQA9P,QACAsR,iBAAA,kBAGAkD,eAAA,SAAA5W,GACAwB,KAAA+R,WACA,aAAA/R,KAAAK,MAAAiB,IAAA,WACApB,EAAAC,QAAA,WAAAY,QAAA,kBAAAf,KAAAK,OAEAgF,OAAAgQ,KAAArV,KAAAK,MAAAiB,IAAA,QAAA,YAKAN,gBAAA,WACA,OACAG,cAAA,WACA,GAAAC,GAAA,SAQA,OAPA,IAAA3B,OAAA2P,KAAApP,KAAAsV,SACAlU,GAAA,eAGA,aAAApB,KAAAuV,UACAnU,GAAA,mBAEAA,GAGAoU,YAAA,WACA,MAAA,IAAA/V,OAAA2P,KAAApP,KAAAsV,OACA,gCAAAtV,KAAAsV,MAAA,MAEA,UASAvb,EAAA,uCAAA,mCAAA,SAAA0b,GC/DA,MAtBA/V,YAAA8H,cAAA5H,QACAE,SAAA,sCACAiC,UAAA0T,EAEAzU,gBAAA,WACA,GAAAoB,GAAApC,IACA,QACA0V,eAAA,WACA,MAAAtT,GAAA0B,WAAA8O,UAGAzR,cAAA,WACA,MAAAiB,GAAA0B,WAAA6R,QAKAlO,WAAA,SAAAC,EAAA3F,GACAtC,OAAAiI,EAAAzF,IAAAC,KAAA,iBAAAyF,OAAA5F,EAAAE,SCTAlI,EAAA,kCAAA,uCAAA,SAAA6b,GA6CA,MA3CAlW,YAAA6D,WAAA3D,QACAE,SAAA,qCAEA0D,SACA6P,QAAA,qBACAC,UAAA,wBAGAvT,WAAA,WACAC,KAAAC,SAAAC,EAAAC,QAAA,UAAA,qBAAAH,KAAA6V,mBACA7V,KAAAC,SAAAC,EAAAC,QAAA,UAAA,eAAAH,KAAA8V,wBAEA9V,KAAA+V,iBAAA7V,EAAAC,QAAA,WAAAkB,QAAA,wBACArB,KAAA0T,kBAAA1T,KAAA+V,iBAEA/V,KAAAgW,iBAAA9V,EAAAC,QAAA,WAAAkB,QAAA,wBACArB,KAAA4T,oBAAA5T,KAAAgW,kBAGAhU,OAAA,WACAhC,KAAAqT,QAAAxP,KAAA,GAAA+R,IAAA9R,WAAA9D,KAAA0T,qBACA1T,KAAAsT,UAAAzP,KAAA,GAAA+R,IAAA9R,WAAA9D,KAAA4T,wBAGA3L,MAAA,WACA,MAAAxI,QAAAO,KAAAiC,IAAA6D,UAGA+P,kBAAA,SAAAI,EAAAC,GACAlW,KAAAqT,QAAAU,QACA/T,KAAAsT,UAAAS,QACA/T,KAAAqT,QAAAxP,KAAA,GAAA+R,IAAA9R,WAAAmS,KACAjW,KAAAsT,UAAAzP,KAAA,GAAA+R,IAAA9R,WAAAoS,MAIAJ,uBAAA,WACA9V,KAAAqT,QAAAxP,KAAA,GAAA+R,IAAA9R,WAAA9D,KAAA+V,oBACA/V,KAAAsT,UAAAzP,KAAA,GAAA+R,IAAA9R,WAAA9D,KAAAgW,yBC1CAjc,EAAA,6CAAA,WAkCA,MAjCA2F,YAAAC,SAAAC,QACAC,QAAA,MACAC,SAAA,4CAEAC,WAAA,WACAC,KAAAK,MAAAC,GAAA,kBAAAN,KAAAI,OAAAJ,OAGAiG,gBAAA,WACAjG,KAAAK,MAAA6F,IAAA,kBAAAlG,KAAAI,SASAG,SAAA,WACAP,KAAAQ,IAAAR,KAAAQ,IAAAC,WACAT,KAAAQ,IAAAE,SACAV,KAAAW,WAAAX,KAAAQ,MAGAI,QACAuV,oBAAA,cAGAC,WAAA,SAAA5X,GACA0B,EAAAC,QAAA,UAAAY,QAAA,mBAAAf,KAAAK,YC9BAtG,EAAA,uCAAA,2CAAA,SAAAsc,GAOA,MANA3W,YAAAoC,eAAAlC,QACAC,QAAA,QACA+E,UAAA,aACA7C,UAAAsU,MCJAtc,EAAA,wCAAA,WAcA,MAbA2F,YAAAC,SAAAC,QACAC,QAAA,MACAC,SAAA,sCAEAc,QACA0V,qBAAA,oBAGAC,iBAAA,SAAA/X,GACA0B,EAAAC,QAAA,UAAAY,QAAA,0BCVAhH,EAAA,mCAAA,WAMA,MALA2F,YAAAC,SAAAC,QACAC,QAAA,MACAC,SAAA,kCAKA/F,EAAA,gCAAA,oCAAA,iCAAA,SAAA+Q,EAAA0L,GCmTA,MAlUA9W,YAAA6D,WAAA3D,QACAC,QAAA,MACAC,SAAA,6BAEA0D,SACAiT,MAAA,qBAGA1W,WAAA,SAAAsG,GACArG,KAAA6L,UAAAxF,EAAAwF,cAMA,KAAA3L,EAAAC,QAAA,gBAAAH,KAAAK,MAAAiB,IAAA,SAAAD,QAAA,mBAAAnB,EAAAC,QAAA,gBAAAH,KAAAK,MAAAiB,IAAA,SAAAD,QAAA,mBAGArB,KAAA6L,UAAAvL,GAAA,UAAAN,KAAAK,MAAAiB,IAAA,QAAAtB,KAAAI,OAAAJ,MAGAA,KAAAK,MAAAC,GAAA,eAAAN,KAAA0W,YAAA1W,MACAA,KAAAK,MAAAC,GAAA,iBAAAN,KAAA2W,cAAA3W,KAEA,IAAApB,GAAAoB,KAAAK,MAAAiB,IAAA,OACA,IAAA1C,EACA,IAAA,GAAArE,KAAAqE,GACAA,EAAAZ,eAAAzD,IACAyF,KAAA6L,UAAAvL,GAAA,UAAA/F,EAAAyF,KAAAI,OAAAJ,KAKA,IAAAqM,GAAArM,KAAAK,MAAAiB,IAAA,SACA,IAAA+K,EAAA,CAEA,OAAA,KAAAA,EAAAuK,SAAAvK,EAAAuK,QAAA,CAEA,GAAArC,GAAAvU,KAAAK,MAAAiB,IAAA,QACAtB,MAAAK,MAAA6I,IAAA,QAAAqL,EAAA,0EAGArU,EAAAC,QAAA,WAAAY,QAAA,SAAAf,KAAAK,MAAAL,KAAA6L,UAAA7L,MACAA,KAAAK,MAAAC,GAAA,WAAAN,KAAAI,OAAAJ,MAMAA,KAAAC,SAAAC,EAAAC,QAAA,UAAA,SAAAH,KAAA6W,cAKA7W,KAAAC,SAAAC,EAAAC,QAAA,UAAA,SAAAH,KAAA8W,eAGA7Q,gBAAA,WACAjG,KAAA6L,UAAA3F,IAAA,UAAAlG,KAAAK,MAAAiB,IAAA,QAAAtB,KAAAI,QACAJ,KAAAK,MAAA6F,IAAA,eAAAlG,KAAA0W,YAEA,IAAA9X,GAAAoB,KAAAK,MAAAiB,IAAA,OACA,IAAA1C,EACA,IAAA,GAAArE,KAAAqE,GACAA,EAAAZ,eAAAzD,IACAyF,KAAA6L,UAAA3F,IAAA,UAAA3L,EAAAyF,KAAAI,OAkBA,IAbAJ,KAAAK,MAAAiB,IAAA,WACAtB,KAAAK,MAAA6F,IAAA,WAAAlG,KAAAI,OAAAJ,MAMAE,EAAAC,QAAA,WAAAH,KAAAK,MAAAiB,IAAA,SAAAP,QAAA,kBAAAf,KAAAK,MAAAL,KAAA6L,UAAA7L,MACAE,EAAAC,QAAA,gBAAAH,KAAAK,MAAAiB,IAAA,SAAAP,QAAA,kBAAAf,KAAAK,MAAAL,KAAA6L,UAAA7L,MAKA,WAAAA,KAAAK,MAAAiB,IAAA,QAAA,CACA,GAAAyV,GAAA/W,KAAAK,MAAAiB,IAAA,QACArE,EAAA+C,KAAA6L,UAAAvK,IAAAyV,EACA/W,MAAA6L,UAAA3C,IAAA6N,EAAA3M,EAAA4M,SAAA/Z,IAAAga,QAAA,MAKAC,eAAA,WAIA,GAAA,WAAAlX,KAAAK,MAAAiB,IAAA,QAAA,CACA,GAAAyV,GAAA/W,KAAAK,MAAAiB,IAAA,QACArE,EAAA+C,KAAA6L,UAAAvK,IAAAyV,EACA/W,MAAA6L,UAAA3C,IAAA6N,EAAA3M,EAAA+M,OAAAla,IAAAga,QAAA,IAGA/W,EAAAC,QAAA,OAAAY,QAAA,uBAAAf,KAAAK,MAAAL,KAAA6L,WACA3L,EAAAC,QAAA,gBAAAH,KAAAK,MAAAiB,IAAA,SAAAP,QAAA,uBAAAf,KAAAK,MAAAL,KAAA6L,UAAA7L,MACAE,EAAAC,QAAA,WAAAH,KAAAK,MAAAiB,IAAA,SAAAP,QAAA,uBAAAf,KAAAK,MAAAL,KAAA6L,UAAA7L,OAGAO,SAAA,WACAP,KAAA8K,sBAAA,CAMA5K,GAAAC,QAAA,WAAAH,KAAAK,MAAAiB,IAAA,SAAAP,QAAA,iBAAAf,KAAAK,MAAAL,KAAA6L,UAAA7L,MACAE,EAAAC,QAAA,gBAAAH,KAAAK,MAAAiB,IAAA,SAAAP,QAAA,iBAAAf,KAAAK,MAAAL,KAAA6L,UAAA7L,MAEAP,OAAAO,KAAAiC,IAAAC,KAAA,YAAAmI,KAAA,WACA,GAAAtC,GAAAtI,OAAAO,MAAAoX,KAAA,gBACA3X,QAAAO,MAAAqX,KAAA,WACAtP,QAAAA,EACAuP,SAAA,IACAC,MAAA,gBACAxW,QAAA,QACAyW,cAAA,MAIAxX,KAAAK,MAAAiB,IAAA,mBACApB,EAAAC,QAAA,aAAAkB,QAAA,OAAArB,KAMA,IAAAyX,GAAAzX,KAAAK,MAAAiB,IAAA,OAEA,QAAA,KAAAmW,EAAA,CAEA,GAAAC,GAAAjY,OAAAO,KAAAQ,KAAA0B,KAAA,QAEA,QAAAuV,EAAA9E,MACA,IAAA,UACA+E,EAAAC,aACAC,KAAAC,mBACAC,KAAAC,cAEA,MACA,KAAA,WAEA,GAAAC,GAAA9X,EAAAC,QAAA,YAAAkB,QAAA,cAAA,YACA4W,EAAAxL,QAAAyL,gBAAAF,IAAA,EAEAN,GAAAC,aACAQ,MAAA1Y,OAAA,WAAAgT,KAAAwF,GAAAG,OACAR,KAAAC,mBACAC,KAAAC,cAEA,MACA,KAAA,SACAN,EAAAY,QAAAX,EAAAD,KAAAA,EAAAY,OACA,MACA,SAEAC,QAAAC,IAAA,yBAAAd,EAAA9E,KAAA,wBAIA3S,KAAA0W,eAGA1U,OAAA,WAIA9B,EAAAC,QAAA,WAAAH,KAAAK,MAAAiB,IAAA,SAAAP,QAAA,eAAAf,KAAAK,MAAAL,KAAA6L,UAAA7L,MACAE,EAAAC,QAAA,gBAAAH,KAAAK,MAAAiB,IAAA,SAAAP,QAAA,eAAAf,KAAAK,MAAAL,KAAA6L,UAAA7L,OAGA+F,SAAA,WAIA7F,EAAAC,QAAA,WAAAH,KAAAK,MAAAiB,IAAA,SAAAP,QAAA,iBAAAf,KAAAK,MAAAL,KAAA6L,UAAA7L,MACAE,EAAAC,QAAA,gBAAAH,KAAAK,MAAAiB,IAAA,SAAAP,QAAA,iBAAAf,KAAAK,MAAAL,KAAA6L,UAAA7L,OAGA0W,YAAA,WACA1W,KAAAK,MAAAiB,IAAA,UACA7B,OAAAO,KAAAiC,IAAAC,KAAA,eAAAkK,SAAA,YACApM,KAAAyW,MAAA5S,KAAA,GAAA2S,IAAAnW,MAAAL,KAAAK,WAEAZ,OAAAO,KAAAiC,IAAAC,KAAA,eAAAwL,YAAA,YACA1N,KAAAyW,MAAA/N,UAIAiO,cAAA,WACA3W,KAAAK,MAAAiB,IAAA,YACA7B,OAAAO,KAAAiC,IAAAC,KAAA,eAAAkK,SAAA,cACApM,KAAAyW,MAAA5S,KAAA,GAAA2S,IAAAnW,MAAAL,KAAAK,WAEAZ,OAAAO,KAAAiC,IAAAC,KAAA,eAAAwL,YAAA,cACA1N,KAAAyW,MAAA/N,UAIA1H,gBAAA,WACA,GAAAoB,GAAApC,IACA,QAEAwY,cAAA,WACA,GAAAxY,KAAApB,KACA,IAAA,GAAArE,KAAAyF,MAAApB,KACA,GAAAoB,KAAApB,KAAAZ,eAAAzD,IACA6H,EAAAyJ,UAAAvK,IAAA/G,IAAAyF,KAAApB,KAAArE,GACA,MAAA,uBAKA,OAAA,IAGAke,cAAA,WAOA,WANA,KAAArW,EAAAyJ,UAAAvK,IAAAtB,KAAAzF,MACAyF,KAAA/C,MAAAmF,EAAAyJ,UAAAvK,IAAAtB,KAAAzF,UACA,KAAAyF,KAAA/C,QACA+C,KAAA/C,MAAA,IAEAiD,EAAAC,QAAA,OAAAkB,QAAA,eAAA,yBAAArB,KAAA2S,MACA3S,OAGA0Y,mBAAA,WACA,GAAAtX,GAAA,EAQA,OAPApB,MAAA2Y,iBACAvX,GAAA,mBAEA,OAAApB,KAAA2S,OACAvR,GAAA,QAGAA,GAGAD,cAAA,WACA,GAAAC,GAAA,aAWA,YAVA,KAAApB,KAAAuO,MACAnN,GAAA,MAAApB,KAAAuO,MAEAnN,GAAA,eAGApB,KAAAyW,QACArV,GAAA,aAGAA,GAGAwX,cAAA,WACA,MAAA5Y,MAAA6Y,KACA,mIAAA7Y,KAAA6Y,KAAA,SAEA,IAIAC,gBAAA,WACA,MAAA9Y,MAAA2Y,iBAAA3Y,KAAA+Y,gBACA,iEAEA,IAIAC,kBAAA,WACA,MAAAhZ,MAAAsQ,YACA,gBAAAtQ,KAAAsQ,YAAA,IAEA,MAMA1P,QACAqY,kBAAA,gBACAC,iBAAA,eACAC,iBAAA,eACAC,eAAA,cAGAC,cAAA,SAAA7a,GACA0B,EAAAC,QAAA,OAAAY,QAAA,iBAAAvC,EAAAwB,KAAAK,MAAAL,KAAA6L,YAGAyN,aAAA,SAAA9a,GACA0B,EAAAC,QAAA,OAAAY,QAAA,gBAAAvC,EAAAwB,KAAAK,MAAAL,KAAA6L,WACA3L,EAAAC,QAAA,WAAAH,KAAAK,MAAAiB,IAAA,SAAAP,QAAA,gBAAAvC,EAAAwB,KAAAK,MAAAL,KAAA6L,YAGA0N,aAAA,SAAA/a,GACA0B,EAAAC,QAAA,OAAAY,QAAA,gBAAAvC,EAAAwB,KAAAK,MAAAL,KAAA6L,WACA3L,EAAAC,QAAA,gBAAAH,KAAAK,MAAAiB,IAAA,SAAAP,QAAA,gBAAAvC,EAAAwB,KAAAK,MAAAL,KAAA6L,UAAA7L,OAGAgM,WAAA,SAAAxN,GACA0B,EAAAC,QAAA,gBAAAH,KAAAK,MAAAiB,IAAA,SAAAP,QAAA,cAAAvC,EAAAwB,KAAAK,MAAAL,KAAA6L,UAAA7L,MACAE,EAAAC,QAAA,gBAAAH,KAAAK,MAAAiB,IAAA,SAAAP,QAAA,cAAAvC,EAAAwB,KAAAK,MAAAL,KAAA6L,UAAA7L,MACAE,EAAAC,QAAA,gBAAAH,KAAAK,MAAAiB,IAAA,SAAAP,QAAA,cAAAvC,EAAAwB,KAAAK,MAAAL,KAAA6L,UAAA7L,OAGA6W,aAAA,WACA3W,EAAAC,QAAA,gBAAAH,KAAAK,MAAAiB,IAAA,SAAAP,QAAA,gBAAAf,KAAAK,MAAAL,KAAA6L,UAAA7L,OAGA8W,aAAA,WACA5W,EAAAC,QAAA,gBAAAH,KAAAK,MAAAiB,IAAA,SAAAP,QAAA,gBAAAf,KAAAK,MAAAL,KAAA6L,UAAA7L,WCvTAjG,EAAA,mCAAA,gCAAA,SAAAyf,GAoCA,MAnCA9Z,YAAA6D,WAAA3D,QACAC,QAAA,MACAC,SAAA,mCAEA0D,SACAiW,SAAA,iBACAC,WAAA,oBAGAnZ,SAAA,WACA,GAAAoZ,GAAAzZ,EAAAC,QAAA,YAAAkB,QAAA,mBAAA,SACAuY,EAAA1Z,EAAAC,QAAA,YAAAkB,QAAA,mBAAA,cACAwK,EAAA3L,EAAAC,QAAA,YAAAkB,QAAA,eACArB,MAAAyZ,SAAA5V,KAAA,GAAA2V,IAAAnZ,MAAAsZ,EAAA9N,UAAAA,SAMA,KAFA3L,EAAAC,QAAA,UAAAkB,QAAA,kBACAwY,WAAAlH,KAAA,WAEA3S,KAAA0Z,WAAA7V,KAAA,GAAA2V,IAAAnZ,MAAAuZ,EAAA/N,UAAAA,KAEAA,EAAA3C,IAAA,aAAA,IAIAtI,QACA6B,iBAAA,gBAGAE,aAAA,SAAAnE,GACA0B,EAAAC,QAAA,OAAAY,QAAA,uBAAAvC,QChCAzE,EAAA,oCAAA,WAMA,MALA2F,YAAAC,SAAAC,QACAC,QAAA,MACAC,SAAA,sCCDA/F,EAAA,gCACA,8BACA,+BACA,gCACA,sCACA,iCACA,sCACA,qCACA,kCACA,kCACA,SACA+f,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,GAsFA,MApFA7a,YAAA5B,OAAA8B,QACAG,WAAA,WAEAC,KAAA8D,WAAA,GAAAgW,KAEApb,GAAA,WAEA8b,eAAA,SAAAnU,GACA,MAAA,IAAA0T,GAAA1T,MAIA3H,GAAA,YAEA8b,eAAA,SAAAnU,GACA,MAAA,IAAA6T,GAAA7T,MAIA3H,GAAA,eAKAiR,cAAA,SAAAtJ,GAMA,OAAA,KAAAA,EAAAoU,UACA,GAAAC,GAAAxa,EAAAC,QAAAkG,EAAAoU,UAAAnZ,IAAA,OAAAD,QAAA,yBAAA4Y,MAEA,IAAAS,GAAAT,CAEA,OAAA,IAAAS,GAAArU,IAGAmU,eAAA,SAAAnU,GACA,MAAA,IAAA2T,GAAA3T,MAIA3H,GAAA,cAGAiR,cAAA,SAAAtJ,GACA,MAAA,IAAA+T,GAAA/T,IAGAmU,eAAA,SAAAnU,GACA,MAAA,IAAA8T,GAAA9T,MAIA3H,GAAA,UAGAiR,cAAA,SAAAtJ,GACA,MAAA,IAAAiU,GAAAjU,IAGAmU,eAAA,SAAAnU,GACA,MAAA,IAAAgU,GAAAhU,OAMAnG,EAAAC,QAAA,OAAAgF,MAAA,uBAAAnF,KAAA2a,oBAAA3a,MAEAE,EAAAC,QAAA,OAAAgF,MAAA,aAAAnF,KAAA4a,UAAA5a,OAGA2a,oBAAA,WACA,MAAA3a,MAAA8D,YAGA8W,UAAA,SAAAlc,GACA,MAAAsB,MAAA8D,WAAAxC,IAAA5C,QCvGA3E,EAAA,2CAAA,WAqBA,MApBA2F,YAAAC,SAAAC,QACAC,QAAA,MACAC,SAAA,sDAEAkB,gBAAA,WACA,OACAiU,mBAAA,WACA,GAAAvQ,GAAAxE,EAAAC,QAAA,OAAAkB,QAAA,qBACA6T,EAAAxQ,EAAApD,IAAA,MACAqR,EAAAzS,EAAAC,QAAA+U,GAAA7T,QAAA,WAAArB,KAAA2S,KACA,YAAA,KAAAA,EACAA,EAAArR,IAAA,YAEA,UCdAvH,EAAA,qBAAA,WAMA,MALA2F,YAAAC,SAAAC,QACAC,QAAA,MACAC,SAAA,qBCHA/F,EAAA,0BAAA,wCAAA,mBAAA,SAAA8gB,EAAAC,GAkCA,MAjCA3R,UAAAC,MAAAxJ,QACAyJ,UACAnI,UAAA,GACAE,QAAA,GACA0H,QAAA,EACAtH,IAAA,GACAuZ,SAAA,EACAnZ,UAAA,EAEAoZ,qBAAA,SAAA3U,GACA,MAAA,IAAAwU,GAAAxU,IAGA4U,4BAAA,SAAA5U,GACA,MAAA,IAAAwU,GAAAxU,IAGA6U,kBAAA,SAAA7U,GAIA,MAAA,IAAAyU,IAGAK,mBAAA,SAAA9U,GAIA,MAAA,IAAAyU,SC7BA/gB,EAAA,+BAAA,0BAAA,SAAAqhB,GAIA,MAHAjS,UAAAK,WAAA5J,QACAS,MAAA+a,MAIArhB,EAAA,4BAAA,WCRA,MALA2F,YAAAC,SAAAC,QACAC,QAAA,MACAC,SAAA,iCAKA/F,EAAA,6CAAA,WCiGA,MAxGA2F,YAAAoC,eAAAlC,QACAC,QAAA,MACAwb,eAAA,EAEApH,aAAA,WACA,MAAA/T,GAAAC,QAAA,SAAAkB,QAAA,kBAGAia,aAAA,WACA,MAAApb,GAAAC,QAAA,SAAAkB,QAAA,yBAGAtB,WAAA,WACAG,EAAAC,QAAA,UAAAgF,MAAA,iBAAAnF,KAAAub,cAAAvb,MACAE,EAAAC,QAAA,UAAAgF,MAAA,gBAAAnF,KAAAwb,aAAAxb,MACAE,EAAAC,QAAA,UAAAgF,MAAA,mBAAAnF,KAAAyb,gBAAAzb,OAGAO,SAAA,WACA,GAAAP,KAAA8D,WAAA0G,OAAA9O,OAAA,EAAA,CACA+D,OAAAO,KAAAiC,IAAAmK,SAAA,2BAAAA,SAAA,qBAWApM,MAAAwb,eAGAtb,EAAAC,QAAA,OAAAY,QAAA,wBAAAf,OAGAub,cAAA,WACA,MAAAvb,MAAAiC,IAGAuZ,aAAA,WACA,GAAAtb,EAAAC,QAAA,OAAAkB,QAAA,mBAMA5B,OAAAO,KAAAiC,IAAAoO,UAEAE,OAAA,QACAmL,OAAA,oBACApL,YAAA,iCACAW,QAAA,IACAI,MAAA,EAAA,GAEAF,SAAA,WACAwK,kBAAA,GAEA/K,QAAA,SAAApS,EAAAkS,GACAA,EAAAkL,KAAAC,UACA3b,EAAAC,QAAA,OAAAkB,QAAA,yBAAAqP,IAGAD,KAAA,SAAAjS,EAAAkS,GACAA,EAAAkL,KAAAC,UACA3b,EAAAC,QAAA,OAAAkB,QAAA,sBAAAqP,IAGAC,IAAA,SAAAnS,EAAAkS,GACAA,EAAAkL,KAAAC,UACA3b,EAAAC,QAAA,OAAAkB,QAAA,qBAAAqP,IAGAI,MAAA,SAAAtS,EAAAkS,GACAA,EAAAkL,KAAAC,UACA3b,EAAAC,QAAA,OAAAkB,QAAA,uBAAAqP,IAGAG,OAAA,SAAArS,EAAAkS,GACAA,EAAAkL,KAAAC,UACA3b,EAAAC,QAAA,OAAAkB,QAAA,wBAAAqP,EAAA1Q,OAGA+Q,KAAA,SAAAvS,EAAAkS,GACAA,EAAAkL,KAAAC,UACA3b,EAAAC,QAAA,OAAAkB,QAAA,sBAAAqP,OAKA+K,gBAAA,WACAhc,OAAAO,KAAAiC,IAAAoO,SAAA,YAGAmB,WAAA,SAAAzP,GACA7B,EAAAC,QAAA,UAAAkB,QAAA,gBACAU,EAAAvB,IAAAsb,OAAAjY,KAAA,QACA3D,EAAAC,QAAA,UAAAkB,QAAA,cAAA,SASAtH,EAAA,uCAAA,WCzEA,MAlCA2F,YAAAC,SAAAC,QACAC,QAAA,MACAC,SAAA,2BAEAC,WAAA,WACAC,KAAAK,MAAAC,GAAA,yBAAAN,KAAA+b,gBAAA/b,OAGAO,SAAA,WACAP,KAAA+b,mBAGAA,gBAAA,WACA,GAAA/b,KAAAK,MAAAiB,IAAA,mBACA,GAAA0a,GAAA9b,EAAAC,QAAA,OAAAkB,QAAA,eAAA,wCAEA,IAAA2a,GAAA9b,EAAAC,QAAA,OAAAkB,QAAA,eAAA,kCAEA5B,QAAAO,KAAAiC,IAAAC,KAAA,eAAAuQ,KAAAuJ,EAAAhc,QAGAiG,gBAAA,WACAjG,KAAAK,MAAA6F,IAAA,yBAAAlG,KAAAI,SAGAQ,QACAqb,mBAAA,sBAGAC,mBAAA,SAAA1d,GACA0B,EAAAC,QAAA,UAAAY,QAAA,sBAAAvC,EAAAwB,KAAAK,YCvBAtG,EAAA,qCAAA,qCAAA,SAAAoiB,GA0EA,MAzEAzc,YAAA6D,WAAA3D,QACAC,QAAA,MACAC,SAAA,qDAEAC,WAAA,WACAC,KAAAK,MAAAC,GAAA,eAAAN,KAAAI,OAAAJ,MACAA,KAAAK,MAAAC,GAAA,eAAAN,KAAAoc,kBAAApc,OAGAwD,SACA6Y,SAAA,uBAGApW,gBAAA,WACAjG,KAAAK,MAAA6F,IAAA,eAAAlG,KAAAI,QACAJ,KAAAsc,aAAAC,UACAvc,KAAAK,MAAAmc,MAAA,QAAAvF,QAAA,KAGA1W,SAAA,WACAP,KAAAoc,mBACA,IAAAha,GAAApC,IACAA,MAAAsc,aAAA,GAAAjF,MAAA,WACAtW,QAAA,QACA0b,MAAA,sBACAxV,UACAyV,EAAA,OACAC,EAAA,UAEAC,QAAA,IACApF,aAAA,OAEAqF,UAAA,WACA7c,KAAA8c,WAAArd,OAAA2C,EAAAH,IAAAC,KAAA,2BAGAlC,KAAAsc,aAAAS,OAAAtd,OAAAO,KAAAiC,IAAAC,KAAA,eACAlC,KAAAK,MAAA6I,IAAA,OAAAlJ,KAAAsc,cAAArF,QAAA,KAGAmF,kBAAA,WACApc,KAAAqc,UACArc,KAAAqc,SAAAxY,KAAA,GAAAsY,IAAA9b,MAAAL,KAAAK,UAIAW,gBAAA,WACA,OACAiU,mBAAA,WACA,GAAAvQ,GAAAxE,EAAAC,QAAA,OAAAkB,QAAA,qBACA6T,EAAAxQ,EAAApD,IAAA,MACAqR,EAAAzS,EAAAC,QAAA+U,GAAA7T,QAAA,WAAArB,KAAA2S,MACAqK,EAAArK,EAAArR,IAAA,WAEA,IAAAtB,KAAAid,MAAA,CAEAD,GAAA,MADA9c,EAAAC,QAAA+U,GAAA7T,QAAA,WAAAsR,EAAArR,IAAA,SACAA,IAAA,YAEA,MAAA0b,IAGAE,gBAAA,WACA,GAAAld,KAAAid,MACA,GAAAE,GAAA,aAEA,IAAAA,GAAA,OAEA,OAAA,yCAAAA,EAAA,mBClEApjB,EAAA,8BAAA,WAqBA,MApBA2F,YAAAC,SAAAC,QACAC,QAAA,MACAC,SAAA,+BAEAC,WAAA,WACA,GAAAqd,GAAAld,EAAAC,QAAA,WAAAkB,QAAA,iBACArB,MAAAC,SAAAmd,EAAA,MAAApd,KAAAI,QACAJ,KAAAC,SAAAmd,EAAA,SAAApd,KAAAI,SAGAG,SAAA,WAEA,GADAL,EAAAC,QAAA,WAAAkB,QAAA,kBACAmJ,OAAA9O,OACA+D,OAAAO,KAAAiC,IAAA6Z,OAEArc,OAAAO,KAAAiC,IAAA4B,YChBA9J,EAAA,6BAAA,WAMA,MALA2F,YAAAC,SAAAC,QACAC,QAAA,MACAC,SAAA,kCCLA/F,EAAA,4BAAA,WAuDA,MAtDA2F,YAAAC,SAAAC,QACAC,QAAA,MACAC,SAAA,yBAEAC,WAAA,aAWAQ,SAAA,WAKAP,KAAA0E,cAAAxE,EAAAC,QAAA,OAAAkB,QAAA,sBAGAT,QACAyc,6BAAA,uBACAC,0BAAA,YACAC,6BAAA,gBACAC,wBAAA,cACAC,2BAAA,uBAGAC,UAAA,SAAAlf,GACA0B,EAAAC,QAAA,OAAAkB,QAAA,cACAnB,EAAAC,QAAA,OAAAY,QAAA,aAAAvC,EAAAwB,KAAAK,QAIAsd,cAAA,SAAAnf,GACA0B,EAAAC,QAAA,OAAAY,QAAA,aAAAvC,EAAAwB,KAAAK,QAGAud,YAAA,SAAApf,GACA0B,EAAAC,QAAA,OAAAY,QAAA,eAAAvC,EAAAwB,KAAAK,QAGAwd,oBAAA,SAAArf,GACA0B,EAAAC,QAAA,OAAAY,QAAA,kBAAAvC,EAAAwB,KAAAK,QAGAyd,qBAAA,SAAAtf,GACA0B,EAAAC,QAAA,OAAAY,QAAA,wBAAAvC,EAAAwB,KAAAK,YCjDAtG,EAAA,4BAAA,0BAAA,SAAAgkB,GAsGA,MArGAre,YAAA6D,WAAA3D,QACAC,QAAA,KACAC,SAAA,uBAEA0D,SACAwa,aAAA,qBAGAje,WAAA,WACAC,KAAAF,SAAAI,EAAAC,QAAA,WAAAkB,QAAA,2BAAArB,KAAAF,SACAE,KAAAK,MAAAC,GAAA,eAAAN,KAAAI,OAAAJ,MACAA,KAAAK,MAAAC,GAAA,oBAAAN,KAAAI,OAAAJ,MACAA,KAAAK,MAAAC,GAAA,gBAAAN,KAAAie,gBAAAje,OAGAiG,gBAAA,WACAjG,KAAAK,MAAA6F,IAAA,eAAAlG,KAAAI,QACAJ,KAAAK,MAAA6F,IAAA,oBAAAlG,KAAAI,QACAJ,KAAAK,MAAA6F,IAAA,gBAAAlG,KAAAie,kBAGA1d,SAAA,WACAP,KAAAK,MAAAiB,IAAA,cACA7B,OAAAO,KAAAiC,IAAAmK,SAAA,UAEA3M,OAAAO,KAAAiC,IAAAyL,YAAA,UAGA1N,KAAAie,kBAEAje,KAAAge,aAAAna,KAAA,GAAAka,IAAA1d,MAAAL,KAAAK,UAGA4d,gBAAA,WACA,GAAAje,KAAAK,MAAAiB,IAAA,UACA7B,OAAAO,KAAAiC,IAAAmK,SAAA,eAEA3M,OAAAO,KAAAiC,IAAAyL,YAAA,gBAIA9M,QACAsd,eAAA,eACAC,MAAA,kBAGAC,eAAA,SAAA5f,GACA,MAAAiB,OAAAjB,EAAAwP,QAAAlI,SAAA3L,KAAA,YACA+F,EAAAC,QAAA,OAAAY,QAAA,aAAAvC,EAAAwB,KAAAK,QAIAge,aAAA,SAAA7f,GACA,GAAAuY,GAAAtX,OAAAjB,EAAAwP,QAAA3H,KAAA,WACAwD,EAAA3J,EAAAC,QAAA,WAAAkB,QAAA,mBAAA0V,EACAuB,SAAAC,IAAA1O,GACAyO,QAAAC,IAAAvY,KAAAK,OACAH,EAAAC,QAAA,OAAAkB,QAAA,iBAAA7C,EAAAqL,EAAA7J,KAAAK,OACAH,EAAAC,QAAA,OAAAkB,QAAA,cAGAL,gBAAA,WACA,OACAsd,aAAA,SAAAC,GACAve,KAAAue,YAAAA,GAAA,QACA,IAAAC,GAAAxe,KAAAuU,KACAvU,MAAAuU,MAAA,GACAvU,KAAA/C,MAAA+C,KAAAA,KAAAue,aACAve,KAAAzF,KAAAyF,KAAAtB,GAAA,IAAAsB,KAAAue,WACA,IAAA9L,GAAAvS,EAAAC,QAAA,OAAAkB,QAAA,eAAA,+BAGA,OAFAoR,GAAAA,EAAAzS,MACAA,KAAAuU,MAAAiK,EACA/L,GAGAwC,mBAAA,WACA,GAAAtC,GAAAzS,EAAAC,QAAA,WAAAkB,QAAA,WAAArB,KAAA2S,KACA,QAAA,KAAAA,EAEA,MAAAA,GAAArR,IAAA,aAGAsX,cAAA,WACA,MAAA5Y,MAAA6Y,KACA,mIAAA7Y,KAAA6Y,KAAA,SAEA,IAIAC,gBAAA,WACA,MAAA9Y,MAAA2Y,eACA,iEAEA,UAUA5e,EAAA,oCAAA,WCnEA,MA/CA2F,YAAAC,SAAAC,QACAC,QAAA,MACAC,SAAA,sCAEAmG,gBAAA,WACAxG,OAAAO,KAAAiC,IAAA6D,SAAAA,SAAA4H,YAAA,qBAIAnN,SAAA,WACAP,KAAAQ,IAAAR,KAAAQ,IAAAC,WACAT,KAAAQ,IAAAE,SACAV,KAAAW,WAAAX,KAAAQ,MAGAwB,OAAA,WACAvC,OAAAO,KAAAiC,IAAA6D,SAAAA,SAAAsG,SAAA,yBCPArS,EAAA,6BAAA,2BAAA,kCAAA,SAAA0kB,EAAAvO,GA4BA,MA3BAxQ,YAAA8H,cAAA5H,QACAE,SAAA,wBACAiC,UAAA0c,EACAvO,UAAAA,EAEAnQ,WAAA,WACAC,KAAAF,SAAAI,EAAAC,QAAA,WAAAkB,QAAA,4BAAArB,KAAAF,UAGAS,SAAA,WACAd,OAAAO,KAAAiC,IAAAyc,WACAC,OAAA,4BACAxO,YAAA,sBACAyO,WAAA,qBACAC,KAAA,SAAArgB,EAAAkS,GACAxQ,EAAAC,QAAA,OAAAkB,QAAA,kBAAA7C,EAAAkS,OAKAjJ,WAAA,SAAAC,EAAA3F,OACA,KAAA7B,EAAAC,QAAA,WAAAkB,QAAA,WAAAU,EAAA1B,MAAAiB,IAAA,UAEA7B,OAAAiI,EAAAzF,IAAAC,KAAA,SAAAyF,OAAA5F,EAAAE,SAOAlI,EAAA,+BAAA,WCnCA,MALA2F,YAAAC,SAAAC,QACAC,QAAA,MACAC,SAAA,oCAKA/F,EAAA,8BAAA,WCFA,MALA2F,YAAAC,SAAAC,QACAC,QAAA,MACAC,SAAA,mCAKA/F,EAAA,gCAAA,WCkCA,MAzCA2F,YAAAC,SAAAC,QACAC,QAAA,MACAC,SAAA,6BAEAmG,gBAAA,WACAjG,KAAAK,MAAA6F,IAAA,oBAAAlG,KAAA8e,oBAGA/e,WAAA,WACAC,KAAAK,MAAAC,GAAA,oBAAAN,KAAA8e,kBAAA9e,OAGAY,QACAud,MAAA,aAGAT,UAAA,SAAAlf,GACA0B,EAAAC,QAAA,YAAAY,QAAA,aAAAvC,EAAAwB,KAAAK,QAGAW,gBAAA,WACA,OACAG,cAAA,WACA,GAAAC,GAAA,mBAAApB,KAAAtB,EAIA,OAHAsB,MAAA+e,aACA3d,GAAA,WAEAA,KAKA0d,kBAAA,WACA9e,KAAAK,MAAAiB,IAAA,cACA7B,OAAAO,KAAAiC,IAAAC,KAAA,oBAAAkK,SAAA,UAEA3M,OAAAO,KAAAiC,IAAAC,KAAA,oBAAAwL,YAAA,eAOA3T,EAAA,8BAAA,8BAAA,SAAAilB,GCtCA,MALAtf,YAAAoC,eAAAlC,QACAmC,UAAAid,MCMAjlB,EAAA,8BAAA,WAmEA,MAlEAoP,UAAAC,MAAAxJ,QACAyJ,UACA4V,WAAA,QACAC,aAAA,SACAH,YAAA,EACAI,MAAA,KAGApf,WAAA,WACA,OAAA,KAAAC,KAAAsB,IAAA,QAAA,CAGAtB,KAAAM,GAAA,SAAAN,KAAAqZ,cAAArZ,KAGA,IAAAof,GAAAlf,EAAAC,QAAA,UAAAkB,QAAA,WAAArB,KAAAsB,IAAA,SACA+d,EAAAD,EAAA9d,IAAA,aAGA8I,GAAAC,KAAA+U,EAAA9d,IAAA,mBAAA,SAAA+N,EAAAZ,OACA,KAAAzO,KAAAsB,IAAAmN,IACAzO,KAAAkJ,IAAAuF,EAAAY,GAAA4H,QAAA,KAEAjX,MAKA,SAAAof,EAAA9d,IAAA,YACAtB,KAAAkJ,IAAA,OAAAkW,EAAA9d,IAAA,SAYApB,EAAAC,QAAA,UAAAY,QAAA,kBAAAf,MACAE,EAAAC,QAAA,UAAAkf,GAAAte,QAAA,kBAAAf,MACAE,EAAAC,QAAA,UAAAH,KAAAsB,IAAA,SAAAP,QAAA,kBAAAf,MAEAA,KAAAC,SAAAC,EAAAC,QAAA,OAAA,sBAAAH,KAAAsf,kBAUAjG,cAAA,SAAAhZ,EAAA2M,GACA9M,EAAAC,QAAA,gBAAAiK,EAAAoE,KAAAnO,EAAAkf,qBAAA,IAAAxe,QAAA,iBAAAf,KAAAgN,EAAAnD,cACA3J,EAAAC,QAAA,UAAAY,QAAA,iBAAAf,KAAAgN,EAAAnD,cACA3J,EAAAC,QAAA,OAAAY,QAAA,iBAAAf,KAAAgN,EAAAnD,eAGAyV,eAAA,SAAAE,EAAA3V,GACA3J,EAAAC,QAAA,OAAAY,QAAA,mBAAAf,KAAAwf,EAAA3V,QC5DA9P,EAAA,iCAAA,4BAAA,SAAA0lB,GA+DA,MA9DAtW,UAAAK,WAAA5J,QACAS,MAAAof,EACA7N,WAAA,SAAAvR,GACA,MAAAqf,UAAArf,EAAAiB,IAAA,WAEAqe,OAAA,EAEA5f,WAAA,WACAC,KAAAM,GAAA,MAAAN,KAAA4f,SAAA5f,MACAA,KAAAM,GAAA,SAAAN,KAAA6f,YAAA7f,MAEAA,KAAAC,SAAAD,KAAA,YAAAA,KAAA8f,aACA9f,KAAAC,SAAAD,KAAA,eAAAA,KAAA+f,gBACA/f,KAAAC,SAAAD,KAAA,eAAAA,KAAAggB,qBACAhgB,KAAAigB,WAUAL,SAAA,SAAAvf,GACAL,KAAAigB,OAAAtjB,KAAA0D,EAAAiB,IAAA,QASAue,YAAA,SAAAxf,GACAL,KAAAkgB,WAAAlgB,KAAAkgB,eACAlgB,KAAAkgB,WAAA7f,EAAAiB,IAAA,OAAAjB,EAAAiB,IAAA,OAGAwe,YAAA,SAAAzf,GACAL,KAAA0K,IAAArK,IAGA0f,eAAA,SAAA1f,GACA,GAAA,GAAAL,KAAAtE,OACA,GAAAyjB,GAAA,MAEA,IAAAA,GAAAnf,KAAAmgB,GAAAngB,KAAAtE,OAAA,GAAA4F,IAAA,SAAA,CAGAjB,GAAA6I,IAAA,QAAAiW,GAAAlI,QAAA,IACAjX,KAAA0K,IAAArK,IAGA2f,oBAAA,SAAA3f,GACAL,KAAAsK,OAAAjK,IAGA+f,YAAA,SAAAX,GACA,OAAA,GAAAzf,KAAA7D,QAAAsjB,QCrDA1lB,EAAA,gCAEA,8BAEA,yBACA,0CACA,oCAEA,2BACA,0BACA,4BAEA,4BACA,2BACA,6BAEA,kBAEA,iCAEA,SACA6J,EACAyc,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACA/F,EACAgG,GA2PA,MAzPAphB,YAAA5B,OAAA8B,QACAG,WAAA,WAIAG,EAAAC,QAAA,eAAAkB,QAAA,iBAAArB,KAAA+gB,uBAAA,GAAA/gB,MAKAE,EAAAC,QAAA,eAAAkB,QAAA,iBAAArB,KAAAghB,uBAAA,GAAAhhB,MAKAE,EAAAC,QAAA,sBAAAkB,QAAA,iBAAArB,KAAAihB,6BAAA,GAAAjhB,MACAE,EAAAC,QAAA,sBAAAkB,QAAA,kBAAArB,KAAAihB,6BAAA,GAAAjhB,MAGAA,KAAA8D,WAAA,GAAAF,KAEAlF,GAAA,SACAkU,SAAAsO,OAAAC,iBACApG,SACAqG,IAAA,eACAC,eAAA,eACAC,eAAA,uBACAC,eAAA,wBACAC,aAAA,iBACAC,GAAA,eACAC,KAAA,iBACAC,eAAA,oBAEAra,eAAA,iBAEAsa,iBAAA,WACA,MAAA,IAAAvB,IAcAwB,mBAAA,SAAA/d,GACA,GAAAge,GAAA5hB,EAAAC,QAAA,YAAAkB,QAAA,cAAA,kBAUAygB,KACAA,EAAA5hB,EAAAC,QAAA,YAAAkB,QAAA,cAAA,qBAMA,IAAA0gB,GAAA7hB,EAAAC,QAAA,eAAAkB,QAAA,mBAKA2gB,EAAA5X,EAAA6X,QAAAF,MAAA5iB,IACAN,EAAAuL,EAAA8X,MAAAF,EACAF,GAAAjjB,EAAAijB,EAAA5hB,EAAAC,QAAA,OAAAkB,QAAA,kBAAA,EAMA,IAAA8gB,GAAAjiB,EAAAC,QAAA,eAAAkB,QAAA,mBAKA2gB,EAAA5X,EAAA6X,QAAAE,MAAAhjB,IACAN,EAAAuL,EAAA8X,MAAAF,EAIA,OAHAI,iBAAAvjB,IAEAqB,EAAAC,QAAA,YAAAkB,QAAA,iBAAA,kBAAAygB,GAAA,GACA,GAAAM,kBAAAte,WAAAge,KAGA9G,qBAAA,SAAA3U,GAIA,MAAA,UAAAA,EAAAhG,MAAAiB,IAAA,gBACA,GAAAif,GAAAla,GAEArG,KAAAsB,IAAA,+BAAAjH,KAAA2F,KAAAqG,IAKA6U,kBAAA,SAAA7U,GAKA,GAAAgc,GAAAniB,EAAAC,QAAA,sBAAAkB,QAAA,mBAKA2gB,EAAA5X,EAAA6X,QAAAI,MAAAljB,IACAN,EAAAuL,EAAA8X,MAAAF,EAGA,OAFAM,YAAAzjB,IAEA,GAAAyjB,aAGAnH,mBAAA,WAKA,GAAAkH,GAAAniB,EAAAC,QAAA,sBAAAkB,QAAA,oBAKA2gB,EAAA5X,EAAA6X,QAAAI,MAAAljB,IACAN,EAAAuL,EAAA8X,MAAAF,EAGA,OAFAM,YAAAzjB,IAEA,GAAAyjB,eAKA5jB,GAAA,UACAkU,SAAAsO,OAAAqB,cACAxH,SACAqG,IAAA,eACAC,eAAA,gBACAmB,eAAA,sBACAjB,eAAA,wBACAC,aAAA,iBACAC,GAAA,eACAC,KAAA,iBACAC,eAAA,oBAEAra,eAAA,qBAEAsa,iBAAA,WACA,MAAA,IAAAnB,IAGAoB,mBAAA,WACA,GAAA/d,GAAA5D,EAAAC,QAAA,WAAAkB,QAAA,iBACA,OAAA,IAAAqf,IAAA5c,WAAAA,OAIApF,GAAA,WACAkU,SAAAsO,OAAAuB,eACA1H,SACAqG,IAAA,eACAoB,eAAA,sBACAlB,eAAA,uBACAE,aAAA,iBACAC,GAAA,eACAC,KAAA,iBACAC,eAAA,oBAEAra,eAAA,0BAEAsa,iBAAA,WACA,MAAA,IAAAhB,IAGAiB,mBAAA,WACA,GAAA/d,GAAA5D,EAAAC,QAAA,YAAAkB,QAAA,qBACA,OAAA,IAAAwf,IAAA/c,WAAAA,OAIApF,GAAA,UACAkU,SAAA,eACAxR,QAAA,UACAF,UAAA,uBACAoG,eAAA,uBACA9F,IAAAiL,QAAAiW,cAOAxiB,EAAAC,QAAA,OAAAY,QAAA,wBAAAf,KAAA8D,YAKA5D,EAAAC,QAAA,OAAAgF,MAAA,uBAAAnF,KAAA2iB,oBAAA3iB,MACAE,EAAAC,QAAA,OAAAgF,MAAA,kBAAAnF,KAAA4iB,eAAA5iB,OAGA2iB,oBAAA,WACA,MAAA3iB,MAAA8D,YAGA8e,eAAA,SAAAlkB,GACA,MAAAsB,MAAA8D,WAAAxC,IAAA5C,IAGAqiB,uBAAA,SAAAe,GACA,MAAAxB,IAGAU,uBAAA,SAAAc,GACA,GAAA7Y,GAAA/I,EAAAC,QAAA,UAAAkB,QAAA,kBAIA0gB,EAAA7hB,EAAAC,QAAA,eAAAkB,QAAA,kBAGA,IAAA,GAFA+I,EAAA6X,QAAAF,MAAA5iB,IAEAzD,YAAA,KAAAomB,GAAA,GAAAA,YAAA3Y,UAAAK,WAAA,MAAAP,EAMA,IAAA4Z,GAAAzY,EAAA9O,IAAAwmB,EAAA,SAAArT,GACA,MAAAxF,GAAA4Q,WAAApL,IAAAA,KACAzO,KAEA,OAAA,IAAA8gB,GAAA+B,IAGA5B,6BAAA,SAAAa,GACA,MAAAhH,QC/RA/gB,EAAA,yBAAA,WAiBA,MAhBAoP,UAAAC,MAAAxJ,QACAyJ,UACAyZ,SAAA,GAGA/iB,WAAA,WAEAC,KAAAM,GAAA,eAAAN,KAAA+iB,aAAA/iB,OAGA+iB,aAAA,WAEA7iB,EAAAC,QAAA,OAAAY,QAAA,eAAAf,KAAAsB,IAAA,eCZAvH,EAAA,wBAAA,uBAAA,SAAAipB,GA+EA,MA9EAtjB,YAAA5B,OAAA8B,QACAG,WAAA,WAEA,GAAA6D,GAAA1D,EAAAC,QAAA,OAAAkB,QAAA,uBAEArB,MAAAK,MAAA,GAAA2iB,IACAvV,eAAA,EACA/I,cAAAd,EAAAtC,IAAA,UACA2hB,OAAA,GAMA,IAAAC,GAAA,GAAAzW,QAAAyW,MACAljB,MAAAK,MAAA6I,IAAA,SAAAga,GAKAhjB,EAAAC,QAAA,OAAAgF,MAAA,YAAAnF,KAAAmjB,SAAAnjB,MAKAE,EAAAC,QAAA,OAAAgF,MAAA,WAAAnF,KAAAojB,QAAApjB,MACAE,EAAAC,QAAA,OAAAgF,MAAA,cAAAnF,KAAAqjB,WAAArjB,MACAE,EAAAC,QAAA,OAAAgF,MAAA,oBAAAnF,KAAAsjB,iBAAAtjB,MACAE,EAAAC,QAAA,OAAAgF,MAAA,oBAAAnF,KAAAujB,iBAAAvjB,MACAE,EAAAC,QAAA,UAAAgF,MAAA,cAAAnF,KAAAujB,iBAAAvjB,MAKAE,EAAAC,QAAA,OAAAgF,MAAA,uBAAAnF,KAAAwjB,oBAAAxjB,MACAE,EAAAC,QAAA,OAAAgF,MAAA,uBAAAnF,KAAAyjB,oBAAAzjB,MACAE,EAAAC,QAAA,OAAAgF,MAAA,iBAAAnF,KAAA+L,cAAA/L,OAIAwjB,oBAAA,SAAAnjB,GACAL,KAAA+L,cAAA,gBAAA1L,IAGA0L,cAAA,SAAAgL,EAAA9Z,GAEA,MADA+C,MAAAK,MAAA6I,IAAA6N,EAAA9Z,IACA,GAGAomB,WAAA,SAAAtM,GACA,MAAA/W,MAAAK,MAAAiB,IAAAyV,IAGAqM,QAAA,WACA,MAAApjB,MAAAK,OAGAijB,iBAAA,WACA,MAAAtjB,MAAAK,MAAAiB,IAAA,kBAGAmiB,oBAAA,SAAApb,GAEA,MADArI,MAAA+L,cAAA,gBAAA1D,IACA,GAGAkb,iBAAA,WACA,GAAAG,GAAA1jB,KAAAK,MAAAiB,IAAA,gBACA,OAAApB,GAAAC,QAAA,OAAAkB,QAAA,aAAAqiB,IAGAP,SAAA,WACA,MAAAnjB,MAAAK,MAAAiB,IAAA,eC3EAvH,EAAA,8CAAA,WAmCA,MAlCA2F,YAAA5B,OAAA8B,QACAG,WAAA,WAEAC,KAAAC,SAAAC,EAAAC,QAAA,UAAA,2BAAAH,KAAA2jB;uFAWAA,mBAAA,SAAAnlB,EAAA6B,GACA,GAAAA,EAAAiB,IAAA,WAAA,CAIA,GAAAsiB,IAAA,CACAxZ,GAAAC,KAAAhK,EAAAiB,IAAA,YAAAkJ,OAAA,SAAAuM,GACAA,EAAAzV,IAAA,WACAsiB,GAAA,KAGAA,GACAvjB,EAAA6I,IAAA,WAAA,OAGA7I,GAAA6I,IAAA,WAAA,QC9BAnP,EAAA,8BAAA,WAqOA,MApOA2F,YAAA5B,OAAA8B,QACAG,WAAA,WAEAC,KAAAC,SAAAC,EAAAC,QAAA,UAAA,SAAAH,KAAA6jB,UAEA3jB,EAAAC,QAAA,OAAAgF,MAAA,YAAAnF,KAAA6jB,SAAA7jB,MAKAE,EAAAC,QAAA,eAAAkB,QAAA,iBAAArB,KAAA8jB,kBAAA,GAAA9jB,OAWA6jB,SAAA,SAAAtX,GAEA,GAAArM,EAAAC,QAAA,OAAAkB,QAAA,cAAA,SACA,OAAA,CAOA,IAAA,YAHAkL,EAAAA,GAAA,WAIA,GAAAwX,GAAA,wBACA,IAAA,WAAAxX,EACA,GAAAwX,GAAA,cAGA,IAAAtiB,GAAAvB,EAAAC,QAAA,OAAAkB,QAAA,gBAOA+I,GAAAC,KAAA5I,EAAAH,IAAA,UAAAkJ,OAAA,SAAAiV,EAAA/hB,GACA+hB,EAAAjD,MAAA,QAAAvF,QAAA,KAUA,IAAA6K,GAAA5hB,EAAAC,QAAA,YAAAkB,QAAA,cAAA,kBASAygB,KACAA,EAAA5hB,EAAAC,QAAA,YAAAkB,QAAA,cAAA,qBAGA,IAAA2iB,GAAA9jB,EAAAC,QAAA,eAAAkB,QAAA,mBAKA2gB,EAAA5X,EAAA6X,QAAA+B,MAAA7kB,GAOA,IAFA2iB,EAJA1X,EAAA8X,MAAAF,GAIAF,GAEA,WAAAvV,GAAA9K,EAAAH,IAAA,wBAAA,CACApB,EAAAC,QAAA,OAAAkB,QAAA,cAAA,UACA,IAAA6B,GAAAhD,EAAAC,QAAA,OAAAkB,QAAA,gBAEA,OADA5B,QAAAyD,GAAAkJ,SAAA,iBACA,EAIA,GAAA7H,GAAArE,EAAAC,QAAA,OAAAkB,QAAA,iBAGAgF,EAAAyG,KAAAC,MAAAD,KAAAmX,UAAA1f,GACA8B,GAAA8N,SAAA2N,gBAAAA,CAMA,IAAA5B,GAAA3b,EAAAjD,IAAA,UAAA4e,UAcA9V,GAAAC,KAAAhE,EAAA6d,OAAA,SAAAC,GACA,GAAAzlB,GAAAylB,EAAAzlB,SAEAylB,GAAAzlB,SACAylB,GAAAC,SACA,IAAAjQ,KAEA,KAAA,GAAAha,KAAAgqB,GACAA,EAAAnmB,eAAA7D,KAEAga,EAAAha,GAAAgqB,EAAAhqB,SAEAgqB,GAAAhqB,GAIA,KAAA,GAAA4c,KAAA5C,GACA,OAAAA,EAAA4C,UACA5C,GAAA4C,EAKAoN,GAAAhQ,SAAAA,EACAgQ,EAAAzlB,GAAAA,IAIA2H,EAAAge,eAAAnE,CAOA,IAAAA,GAAA3b,EAAAjD,IAAA,WAAA4e,UAcA9V,GAAAC,KAAAhE,EAAAie,QAAA,SAAA/X,GACA,GAAA7N,GAAA6N,EAAA7N,SAEA6N,GAAA7N,SACA6N,GAAA6X,SACA,IAAAjQ,KAEA,KAAA,GAAAha,KAAAoS,GACAA,EAAAvO,eAAA7D,KAEAga,EAAAha,GAAAoS,EAAApS,SAEAoS,GAAApS,GAIAoS,GAAA4H,SAAAA,EACA5H,EAAA7N,GAAAA,IAIA2H,EAAAke,gBAAArE,EAGA7Z,EAAAyG,KAAAmX,UAAA5d,GAEAnG,EAAAC,QAAA,OAAAY,QAAA,kBAAAsF,GAEA,WAAAkG,IACArM,EAAAC,QAAA,OAAAkB,QAAA,iBAAA,WAAA,GACAnB,EAAAC,QAAA,OAAAY,QAAA,kBAGAb,EAAAC,QAAA,OAAAkB,QAAA,cACAnB,EAAAC,QAAA,WAAAkB,QAAA,MAAA,aAAA,oCAAAmjB,WAAA,KAKA/kB,OAAAkN,KAAAC,SAAAL,OAAAwX,EAAAU,KAAApe,EAAAmG,SAAAC,QAAAC,WAAA,SAAAG,GACA,IACAA,EAAAC,KAAAC,MAAAF,GACAA,EAAAN,OAAAA,EAEArM,EAAAC,QAAA,OAAAY,QAAA,oBAAA8L,GACA3M,EAAAC,QAAA,OAAAkB,QAAA,aAGA,MAAAqjB,GACApM,QAAAC,IAAA,yBACAD,QAAAC,IAAAmM,MAGAC,KAAA,SAAAC,EAAAC,EAAApO,GACA6B,QAAAC,IAAAqM,EAAAC,QACAvM,QAAAC,IAAA9B,GAEAqO,MAAAF,EAAAC,OAAA,IAAApO,EAAA,oKAIAqN,kBAAA,SAAAhC,GACA,MAAAA,GAAAiD,MAAA,YChOAhrB,EAAA,0BAAA,WAWA,MAVAoP,UAAAC,MAAAxJ,QACAG,WAAA,WACAN,OAAAulB,UAAAhlB,KAAAsB,IAAA,OAGAtB,KAAAkJ,IAAA,wBAAA,GAAA+N,QAAA,IAFAjX,KAAAkJ,IAAA,wBAAA,GAAA+N,QAAA,SCHAld,EAAA,4BAAA,wBAAA,SAAA0H,GA2BA,MA1BA/B,YAAA5B,OAAA8B,QACAG,WAAA,WAEAC,KAAAK,MAAA,GAAAoB,IAAA/C,GAAAumB,kBAAAvmB,KAEAsB,KAAAK,MAAA6I,IAAA,SAAAhJ,EAAAC,QAAA,UAAAkB,QAAA,mBAEArB,KAAAK,MAAA6I,IAAA,UAAAhJ,EAAAC,QAAA,WAAAkB,QAAA,mBAEArB,KAAAK,MAAA6I,IAAA,WAAAhJ,EAAAC,QAAA,YAAAkB,QAAA,iBAEAnB,EAAAC,QAAA,OAAAgF,MAAA,gBAAAnF,KAAAklB,aAAAllB,OASAklB,aAAA,WACA,MAAAllB,MAAAK,WCvBAtG,EAAA,iCAAA,WA8DA,MA7DA2F,YAAA5B,OAAA8B,QACAG,WAAA,WAEAC,KAAAC,SAAAC,EAAAC,QAAA,OAAA,qBAAAH,KAAAmlB,eAAAnlB,MACAA,KAAAC,SAAAC,EAAAC,QAAA,OAAA,uBAAAH,KAAAolB,cAAAplB,MACAA,KAAAC,SAAAC,EAAAC,QAAA,OAAA,eAAAH,KAAAqlB,sBAAArlB,OASAmlB,eAAA,WAEAjlB,EAAAC,QAAA,OAAAkB,QAAA,wBACAC,IAAA,WAEA4H,IAAA,YAAA,IAUAmc,sBAAA,SAAApC,GAEA,GAAAqC,GAAAplB,EAAAC,QAAA,OAAAkB,QAAA,wBACAkkB,EAAAD,EAAAhkB,IAAA,UAGA,IAAA2hB,EAGA,GAAArQ,GAAA,mBAFA,IAAAA,GAAA,iBAKA2S,GAAArc,IAAA,WAAA0J,IAUAwS,cAAA,WAEAllB,EAAAC,QAAA,OAAAkB,QAAA,wBACAC,IAAA,WAEA4H,IAAA,YAAA,QCvDAnP,EAAA,iCAAA,WAkBA,MAjBA2F,YAAA5B,OAAA8B,QACAG,WAAA,WACAC,KAAAC,SAAAC,EAAAC,QAAA,OAAA,gBAAAH,KAAAwlB,SACAxlB,KAAAC,SAAAC,EAAAC,QAAA,OAAA,oBAAAH,KAAAylB,cAGAD,QAAA,WACAtlB,EAAAC,QAAA,OAAAkB,QAAA,YAAA,YAGAokB,YAAA,WACA,GAAAC,GAAAxlB,EAAAC,QAAA,WAAAkB,QAAA,iBACAnB,GAAAC,QAAA,OAAAkB,QAAA,cAAA,eAAAyC,WAAA4hB,SCfA3rB,EAAA,4BAAA,WAOA,MANAoP,UAAAC,MAAAxJ,QACAyJ,UACAzH,UAAA,OCHA7H,EAAA,+BAAA,0BAAA,SAAAqhB,GASA,MARAjS,UAAAK,WAAA5J,QACAS,MAAA+a,EAEAxJ,WAAA,SAAAvR,GAEA,OADAqf,SAAArf,EAAAslB,IAAA7pB,QAAA,IAAA,UCLA/B,EAAA,gCAAA,8BAAA,0BAAA,SAAA2rB,EAAAE,GAwCA,MAvCAlmB,YAAA5B,OAAA8B,QACAG,WAAA,WACAC,KAAA8D,WAAA,GAAA4hB,GAEAxlB,EAAAC,QAAA,WAAAgF,MAAA,kBAAAnF,KAAA6lB,eAAA7lB,MAEAE,EAAAC,QAAA,WAAAgF,MAAA,iBAAAnF,KAAA8lB,cAAA9lB,MAEAA,KAAAC,SAAAC,EAAAC,QAAA,OAAA,eAAAH,KAAA+lB,uBAGAF,eAAA,SAAAtZ,EAAAlM,EAAA2lB,EAAAzR,EAAAlO,GACA,GAAAA,OAAA,KAAAA,EAAAA,SACA,KAAAkO,EAAA0R,WACA1R,EAAA0R,SAAA,gBAEA,IAAApjB,GAAA,GAAA+iB,IACArZ,OAAAA,EACAlM,MAAAA,EACA2lB,QAAAA,EACAzR,MAAAA,EACAlO,KAAAA,GAGA,OADArG,MAAA8D,WAAA4G,IAAA7H,GACAA,GAGAijB,cAAA,WACA,MAAA9lB,MAAA8D,YAGAiiB,qBAAA,SAAA9C,GACAA,GACAjjB,KAAA8D,WAAAiQ,aAQAha,EAAA,iCAAA,WCvBA,MA1BA2F,YAAA5B,OAAA8B,QACAG,WAAA,WACAC,KAAAC,SAAAC,EAAAC,QAAA,UAAA,oBAAAH,KAAAkmB,YAAAlmB,MACAA,KAAAC,SAAAC,EAAAC,QAAA,UAAA,mBAAAH,KAAAoW,WAAApW,OAGAkmB,YAAA,WACA,GAAAR,GAAAxlB,EAAAC,QAAA,WAAAkB,QAAA,iBACAqkB,GAAAS,MACA,IAAA/jB,GAAApC,IACAoK,GAAAC,KAAAqb,EAAAlb,OAAA,SAAA4b,GACAhkB,EAAAgU,WAAAgQ,GAAA,KAEAV,EAAA3R,QAEA7T,EAAAC,QAAA,OAAAkB,QAAA,aACAnB,EAAAC,QAAA,OAAAkB,QAAA,iBAAA,SAAA,GACAnB,EAAAC,QAAA,OAAAkB,QAAA,iBAGA+U,WAAA,SAAAgQ,EAAAC,GACAnmB,EAAAC,QAAA,WAAAkB,QAAA,QAAA+kB,EAAA9kB,IAAA,UAAA8kB,EAAAC,QCdAtsB,EAAA,qCAAA,WA+DA,MA9DA2F,YAAA5B,OAAA8B,QACAG,WAAA,WAEAC,KAAAC,SAAAC,EAAAC,QAAA,OAAA,oBAAAH,KAAAsmB,kBAGAA,gBAAA,SAAAzZ,GAEA,GAAA,YAAAA,EAAAN,OACA,OAAA,MAIA,KAAAM,EAAAxG,KAAAkgB,cAGA,KAAA1Z,EAAAxG,KAAAkgB,QAAArC,QACA9Z,EAAAC,KAAAwC,EAAAxG,KAAAkgB,QAAArC,OAAA,SAAAsC,EAAAC,GACA,GAAAtC,GAAAjkB,EAAAC,QAAA,UAAAkB,QAAA,YAAAolB,EACAtC,IACAA,EAAAjb,IAAA,KAAAsd,SAMA,KAAA3Z,EAAAxG,KAAAkgB,QAAAjC,SACAla,EAAAC,KAAAwC,EAAAxG,KAAAkgB,QAAAjC,QAAA,SAAAkC,EAAAC,GACA,GAAAla,GAAArM,EAAAC,QAAA,WAAAkB,QAAA,aAAAolB,EACAla,IACAA,EAAArD,IAAA,KAAAsd,SAMA,KAAA3Z,EAAAxG,KAAAkgB,QAAAG,OACAtc,EAAAC,KAAAwC,EAAAxG,KAAAkgB,QAAAG,MAAA,SAAAF,EAAAC,GACAvmB,EAAAC,QAAA,OAAAkB,QAAA,iBACA6H,IAAA,KAAAsd,GACAG,QAAAC,aAAA,GAAA,GAAA,sCAAAJ,MAKAtmB,EAAAC,QAAA,OAAAkB,QAAA,iBAAA,WAAA,GACAnB,EAAAC,QAAA,OAAAY,QAAA,kBAGAb,EAAAC,QAAA,OAAAkB,QAAA,cACAnB,EAAAC,QAAA,WAAAkB,QAAA,QAAA,cAGAnB,EAAAC,QAAA,WAAAkB,QAAA,MAAA,YAAA,qBACAnB,EAAAC,QAAA,OAAAY,QAAA,gBAAA8L,GAGA3M,EAAAC,QAAA,OAAAkB,QAAA,iBAAA,SAAA,QCxDAtH,EAAA,kCAAA,WA0FA,MAzFA2F,YAAA5B,OAAA8B,QACAG,WAAA,WAEAC,KAAAC,SAAAC,EAAAC,QAAA,OAAA,aAAAH,KAAA6mB,iBAEA3mB,EAAAC,QAAA,OAAAgF,MAAA,uBAAAnF,KAAA6mB,gBAAA7mB,MAGAE,EAAAC,QAAA,OAAAgF,MAAA,uBAAAnF,KAAA8mB,cAAA9mB,MAEAE,EAAAC,QAAA,OAAAgF,MAAA,sBAAAnF,KAAA+mB,aAAA/mB,MAMAA,KAAAgnB,qBAGAH,gBAAA,SAAAroB,EAAA6B,GAIA,GAAAL,KAAAinB,qBACA,OAAA,CAOA,QAAA,KAAA5mB,EACA,GAAA6U,GAAAzV,OAAAjB,EAAAwP,QAAA3H,KAAA,UACAhG,EAAAH,EAAAC,QAAA,OAAAkB,QAAA,kBAAA6T,EAUA,IAPAhV,EAAAC,QAAA,OAAAkB,QAAA,sBACAnB,EAAAC,QAAA,OAAAkB,QAAA,gBAMA,GAAAhB,EAAAiB,IAAA,OAAA5F,OAAA,CACA,GAAAwrB,GAAAhnB,EAAAC,QAAA,OAAAkB,QAAA,aACAnB,GAAAC,QAAA,OAAAkB,QAAA,uBAAAhB,GACAZ,OAAAynB,GAAA9f,UAAA,GACAlH,EAAAC,QAAA,OAAAY,QAAA,uBAAAV,KAUA4mB,mBAAA,WACA,MAAA,IAAAnpB,OAAA0Q,KAAAxO,KAAAgnB,kBAAAtrB,QAcAorB,cAAA,SAAArY,GACAzO,KAAAgnB,iBAAAvY,IAAA,GAUAsY,aAAA,SAAAtY,SACAzO,MAAAgnB,iBAAAvY,QCvFA1U,EAAA,+BAAA,WAiBA,MAhBA2F,YAAA5B,OAAA8B,QACAG,WAAA,WACAC,KAAAC,SAAAC,EAAAC,QAAA,OAAA,uBAAAH,KAAAmnB,kBAGAA,gBAAA,WACA,GAAAziB,GAAAxE,EAAAC,QAAA,OAAAkB,QAAA,oBACAslB,SAAAS,UAAA,KAAA,KAAA/hB,OAAAgiB,SAAAC,KAAA,WAAA5iB,EAAApD,IAAA,MACA,IAAAimB,GAAA,cACA/lB,EAAA6D,OAAAgiB,SAAAG,WACAC,EAAAjmB,EAAA1F,QAAAyrB,EAAA,GACAjP,SAAAC,IAAAkP,QCRA1tB,EAAA,6BAAA,WA8EA,MA7EA2F,YAAA5B,OAAA8B,QACAG,WAAA,WAEAC,KAAAC,SAAAC,EAAAC,QAAA,QAAA,cAAAH,KAAA0nB,eACA1nB,KAAAC,SAAAC,EAAAC,QAAA,UAAA,SAAAH,KAAA0nB,eACA1nB,KAAAC,SAAAC,EAAAC,QAAA,UAAA,sBAAAH,KAAA0nB,eAGA1nB,KAAAC,SAAAC,EAAAC,QAAA,WAAA,eAAAH,KAAA8f,aACA9f,KAAAC,SAAAC,EAAAC,QAAA,WAAA,gBAAAH,KAAA2nB,cAEA3nB,KAAAC,SAAAC,EAAAC,QAAA,WAAA,sBAAAH,KAAA4nB,oBACA5nB,KAAAC,SAAAC,EAAAC,QAAA,WAAA,uBAAAH,KAAA6nB,qBACA7nB,KAAAC,SAAAC,EAAAC,QAAA,WAAA,wBAAAH,KAAA8nB,sBACA9nB,KAAAC,SAAAC,EAAAC,QAAA,WAAA,eAAAH,KAAA0L,cAGAgc,cAAA,WACA,GAAAhjB,GAAAxE,EAAAC,QAAA,OAAAkB,QAAA,oBACA5B,QAAAsoB,UAAA7hB,IAAA,oBACAzG,OAAA,SAAAyG,IAAA,oBACAxB,EAAApD,IAAA,YACA7B,OAAA4K,KAAA3F,EAAApD,IAAA,WAAA,SAAA0mB,EAAAC,GACAxoB,OAAAsoB,UAAAznB,GAAA,0BAAA,KAAA0nB,EAAA,SAAAxpB,GACA0B,EAAAC,QAAA,WAAAY,QAAAknB,EAAAzpB,KAEAiB,OAAA,SAAAa,GAAA,0BAAA,KAAA0nB,EAAA,SAAAxpB,GACA0B,EAAAC,QAAA,WAAAY,QAAAknB,EAAAzpB,KAEAiB,OAAA,YAAAa,GAAA,0BAAA,KAAA0nB,EAAA,SAAAxpB,GACA0B,EAAAC,QAAA,WAAAY,QAAAknB,EAAAzpB,QAMAshB,YAAA,WACA,YAAA5f,EAAAC,QAAA,OAAAkB,QAAA,qBACAnB,EAAAC,QAAA,OAAAkB,QAAA,cAAA,YAEAnB,EAAAC,QAAA,OAAAkB,QAAA,iBAKAsmB,aAAA,WACA,aAAAznB,EAAAC,QAAA,OAAAkB,QAAA,qBACAnB,EAAAC,QAAA,OAAAkB,QAAA,cAAA,aAEAnB,EAAAC,QAAA,OAAAkB,QAAA,iBAIAumB,mBAAA,WACA,GAAAhkB,GAAA1D,EAAAC,QAAA,OAAAkB,QAAA,wBACA6mB,EAAAtkB,EAAAtC,IAAA,SACApB,GAAAC,QAAA,OAAAkB,QAAA,0BAAA6mB,IAGAL,oBAAA,WACA,GAAAjkB,GAAA1D,EAAAC,QAAA,OAAAkB,QAAA,wBACA8mB,EAAAvkB,EAAAtC,IAAA,UACApB,GAAAC,QAAA,OAAAkB,QAAA,0BAAA8mB,IAGAL,qBAAA,WACA,GAAAlkB,GAAA1D,EAAAC,QAAA,OAAAkB,QAAA,wBACA+mB,EAAAxkB,EAAAtC,IAAA,WACApB,GAAAC,QAAA,OAAAkB,QAAA,0BAAA+mB,IAGA1c,YAAA,WACAxL,EAAAC,QAAA,OAAAkB,QAAA,qBC7EAtH,EAAA,gCAAA,WA8BA,MA7BA2F,YAAA5B,OAAA8B,QACAG,WAAA,WAKAC,KAAAqoB,kBACA,cAGAroB,KAAAC,SAAAC,EAAAC,QAAA,OAAA,iBAAAH,KAAAsoB,cAGAA,YAAA,SAAAjoB,GACA,IAAA,GAAAkoB,KAAAloB,GAAAkf,oBACA,CACAlf,EAAAkf,oBAAAgJ,GAGAroB,EAAAC,QAAA,QAAAE,EAAAiB,IAAA,SAAAD,QAAA,oBAAArB,KAAAqoB,mBAAAroB,KAAAqoB,gBAEA,KAAA,GAAAroB,KAAAqoB,iBAAAlsB,QAAAosB,GACA,OAAA,CAEAroB,GAAAC,QAAA,OAAAkB,QAAA,iBAAA,SAAA,QCzBAtH,EAAA,8BAAA,WAqOA,MApOA2F,YAAA5B,OAAA8B,QACAG,WAAA,WACAG,EAAAC,QAAA,WAAAgF,MAAA,qBAAAnF,KAAAwoB,kBAAAxoB,MACAE,EAAAC,QAAA,WAAAgF,MAAA,iBAAAnF,KAAAyoB,cAAAzoB,MACAE,EAAAC,QAAA,WAAAgF,MAAA,oBAAAnF,KAAA0oB,iBAAA1oB,MACAE,EAAAC,QAAA,WAAAgF,MAAA,uBAAAnF,KAAA2oB,oBAAA3oB,MAEAE,EAAAC,QAAA,WAAAgF,MAAA,kBAAAnF,KAAA4oB,eAAA5oB,MACAE,EAAAC,QAAA,WAAAgF,MAAA,qBAAAnF,KAAA6oB,kBAAA7oB,MACAE,EAAAC,QAAA,WAAAgF,MAAA,wBAAAnF,KAAA8oB,qBAAA9oB,MACAE,EAAAC,QAAA,WAAAgF,MAAA,uBAAAnF,KAAA+oB,oBAAA/oB,OAWAwoB,kBAAA,SAAApC,EAAAC,GACA,GAAA5G,GAAA2G,EAAA9kB,IAAA,SACA0kB,EAAAI,EAAA9kB,IAAA,WACAinB,EAAAvC,EAAAuC,KACAS,EAAAhD,EAAAgD,MACAvJ,GAAAvW,IAAAqf,EAAAS,GACAhpB,KAAAipB,kBAAA7C,EAAAC,IAYAoC,cAAA,SAAArC,EAAAC,GACA,GAAA6C,GAAA9C,EAAA9kB,IAAA,SACAwC,EAAAsiB,EAAA9kB,IAAA,QAAAwC,UAMA,QAJA,KAAAA,EAAAmc,cACAnc,GAAAmc,OAAAiJ,EAAA5nB,IAAA,QAGA+kB,EAAA,CACA,GAAAX,GAAAxlB,EAAAC,QAAA,WAAAkB,QAAA,kBACA8nB,EAAAzD,EAAA1b,OAAA3J,MAAA6oB,GAEA9e,GAAAC,KAAA8e,EAAA,SAAA9oB,GACAA,IAAA+lB,GACAV,EAAApb,OAAAjK,KAKAyD,EAAAwG,OAAA4e,GACAlpB,KAAAipB,kBAAA7C,EAAAC,IAYAsC,oBAAA,SAAAvC,EAAAC,GACA,GAAA6C,GAAA9C,EAAA9kB,IAAA,SACA8nB,EAAAhD,EAAA9kB,IAAA,QAAAwC,UAEA,KAAAuiB,EAAA,CACA,GAAAX,GAAAxlB,EAAAC,QAAA,WAAAkB,QAAA,kBACA8nB,EAAAzD,EAAA1b,OAAA3J,MAAA6oB,GAEA9e,GAAAC,KAAA8e,EAAA,SAAA9oB,GACAA,IAAA+lB,GACAV,EAAApb,OAAAjK,KAKA+oB,EAAA9e,OAAA4e,GACAlpB,KAAAipB,kBAAA7C,EAAAC,IAWAqC,iBAAA,SAAAtC,EAAAC,GACA,GAAAxa,GAAAua,EAAA9kB,IAAA,SACAwC,EAAAsiB,EAAA9kB,IAAA,QAAAwC,UAMA,IAJA5D,EAAAC,QAAA0L,EAAAvK,IAAA,iBAAAD,QAAA,MAAAwK,SAEA/H,GAAAoc,WAAArU,EAAAvK,IAAA,QAEA+kB,EAAA,CACA,GAAAX,GAAAxlB,EAAAC,QAAA,WAAAkB,QAAA,kBACA8nB,EAAAzD,EAAA1b,OAAA3J,MAAAwL,GAEAzB,GAAAC,KAAA8e,EAAA,SAAA9oB,GACAA,IAAA+lB,GACA/lB,EAAA6I,IAAA,YAAA,KAMApF,EAAA/C,QAAA,QAAA+C,GAEA9D,KAAAipB,kBAAA7C,EAAAC,IAWAuC,eAAA,SAAAxC,EAAAC,GACA,GAAAhgB,GAAA+f,EAAA9kB,IAAA,QACA4iB,EAAA7d,EAAA6d,OAEAjb,EAAA/I,EAAAC,QAAA,UAAAkB,QAAA,iBACA+I,GAAAC,KAAA6Z,EAAA,SAAArhB,GACA,GAAAmmB,GAAAnmB,EAAAmmB,MACAnmB,GAAAxC,MACA6I,IAAA,QAAA8f,KAOA/f,EAAAkd,OACAnmB,KAAAipB,kBAAA7C,EAAAC,IAGAwC,kBAAA,SAAAzC,EAAAC,GACA,GAAAhmB,GAAA+lB,EAAA9kB,IAAA,QAEA,KAAA+kB,EAAA,CACA,GAAAX,GAAAxlB,EAAAC,QAAA,WAAAkB,QAAA,kBACA8nB,EAAAzD,EAAA1b,OAAA3J,MAAAA,GAEA+J,GAAAC,KAAA8e,EAAA,SAAAtmB,GACAA,IAAAujB,GACAV,EAAApb,OAAAzH,KAKAxC,EAAAyD,WAAAwG,OAAAjK,GACAL,KAAAipB,kBAAA7C,EAAAC,IAGAyC,qBAAA,SAAA1C,EAAAC,GACA,GAAAhmB,GAAA+lB,EAAA9kB,IAAA,QAIA,IAHA8kB,EAAA9kB,IAAA,QAAAwC,WACA4G,IAAArK,IAEAgmB,EAAA,CACA,GAAAX,GAAAxlB,EAAAC,QAAA,WAAAkB,QAAA,kBACA8nB,EAAAzD,EAAA1b,OAAA3J,MAAAA,GAEA+J,GAAAC,KAAA8e,EAAA,SAAA9oB,GACAA,IAAA+lB,GACA/lB,EAAA6I,IAAA,YAAA,KAKAlJ,KAAAipB,kBAAA7C,EAAAC,IAGA0C,oBAAA,SAAA3C,EAAAC,GACA,GAAAhgB,GAAA+f,EAAA9kB,IAAA,QACAwC,EAAAuC,EAAAvC,WAEAulB,EAAAhjB,EAAAgjB,SAEAjf,GAAAC,KAAAgf,EAAA,SAAAxmB,GACA,GAAAmmB,GAAAnmB,EAAAmmB,MACAnmB,GAAAxC,MACA6I,IAAA,QAAA8f,KAIAllB,EAAAqiB,OACAnmB,KAAAipB,kBAAA7C,EAAAC,IAWA4C,kBAAA,SAAA7C,EAAAC,GACA,GAAAA,OAAA,KAAAA,GAAAA,CACA,KAAAA,EAAA,CAEAnmB,EAAAC,QAAA,OAAAkB,QAAA,YACA,IAAAqkB,GAAAxlB,EAAAC,QAAA,WAAAkB,QAAA,iBACAqkB,GAAApb,OAAA8b,GACA,GAAAV,EAAAhqB,SACAwE,EAAAC,QAAA,OAAAkB,QAAA,iBAAA,SAAA,GACAnB,EAAAC,QAAA,OAAAkB,QAAA,uBC9NAtH,EAAA,oCAAA,WA8BA,MA7BA2F,YAAA5B,OAAA8B,QACAG,WAAA,WACAG,EAAAC,QAAA,OAAAgF,MAAA,kBAAAnF,KAAAspB,eAAAtpB,OAGAspB,eAAA,SAAAjpB,GAEA,GAAAvE,KAEAsO,GAAAC,KAAAhK,EAAAkpB,WAAA,SAAAla,EAAAZ,GACA,GAAAY,YAAAlG,UAAAK,WAAA,CACA,GAAAggB,GAAAtpB,EAAAC,QAAA,OAAAkB,QAAA,uBAAAgO,EACAvT,GAAA2S,GAAA+a,MACAna,aAAAlG,UAAAC,QACAtN,EAAA2S,GAAAzO,KAAAspB,eAAAja,KAEArP,KAGA,IAAAypB,GAAAppB,EAAAgL,OAMA,OAJAjB,GAAAC,KAAAvO,EAAA,SAAAuT,EAAAZ,GACAgb,EAAAvgB,IAAAuF,EAAAY,KAGAoa,OCvBA1vB,EAAA,uCAAA,gCAAA,SAAAyf,GAyBA,MAxBA9Z,YAAA5B,OAAA8B,QACAG,WAAA,WAEAG,EAAAC,QAAA,OAAAgF,MAAA,uBAAAnF,KAAA0pB,oBAAA1pB,OAUA0pB,oBAAA,SAAArpB,GAEA,GAAAsS,GAAAtS,EAAAiB,IAAA,OAIA,OAFApB,GAAAC,QAAAwS,GAAAtR,QAAA,uBAAAhB,IAAAmZ,OCrBAzf,EAAA,0CAAA,WA0DA,MAzDA2F,YAAA5B,OAAA8B,QACAG,WAAA,WAEAG,EAAAC,QAAA,OAAAgF,MAAA,iBAAAnF,KAAAqZ,cAAArZ,MAGAA,KAAAC,SAAAC,EAAAC,QAAA,OAAA,iBAAAH,KAAAqZ,cAAArZ,OAYAqZ,cAAA,SAAA7a,EAAAqL,EAAAgC,EAAA5O,GACA,GAAA1C,GAAAsP,EAAAvI,IAAA,QACA0nB,EAAAnd,EAAAvK,IAAA/G,GACA0C,EAAAA,GAAA,IACAA,KAEAA,EAAAiD,EAAAC,QAAA0J,EAAAvI,IAAA,SAAAD,QAAA,uBAAA7C,EAAAqN,EAAAtR,EAAAsP,QAGA,KAAA5M,IACAA,EAAAwC,OAAAjB,EAAAwP,QAAAqB,OAIAxD,EAAA3C,IAAA3O,EAAA0C,GAAA4M,aAAAA,IACA3J,EAAAC,QAAA,WAAA5F,GAAAwG,QAAA,sBAAA8K,EAAAhC,EAEA,IAAA8f,GAAA1sB,EAEA+oB,GACAuC,KAAAhuB,EACAyuB,OAAAA,EACAW,MAAAA,GAGAjlB,EAAAxE,EAAAC,QAAA,OAAAkB,QAAA,qBAGAkT,GAFA7P,EAAApD,IAAA,OAGAsoB,OAAA/d,EAAAvK,IAAA,cACAiT,MAAA1I,EAAAvK,IAAA,SACA8kB,OAAA,WAAAvc,EAAAvI,IAAA,SAAA,SAAA0nB,EAAA,OAAAW,GAGAzpB,GAAAC,QAAA,WAAAkB,QAAA,kBAAA,gBAAAwK,EAAAma,EAAAzR,QAOAxa,EAAA,wCAAA,gCAAA,SAAAyf,GC0BA,MA7FA9Z,YAAA8H,cAAA5H,QACAE,SAAA,6BACAiC,UAAAyX,EAEAzZ,WAAA,SAAAsG,GACArG,KAAA8D,WAAA9D,KAAAK,MAAAiB,IAAA,YACAtB,KAAAgU,kBAAAnI,UAAAxF,EAAAwF,WACA7L,KAAA6L,UAAAxF,EAAAwF,SACA,IAAAjN,GAAAoB,KAAAK,MAAAiB,IAAA,OACA,IAAA1C,EACA,IAAA,GAAArE,KAAAqE,GACAA,EAAAZ,eAAAzD,IACAyF,KAAA6L,UAAAvL,GAAA,UAAA/F,EAAAyF,KAAAI,OAAAJ,KAIAA,MAAAK,MAAAC,GAAA,WAAAN,KAAAI,OAAAJ,OAGAiG,gBAAA,WACA,GAAArH,GAAAoB,KAAAK,MAAAiB,IAAA,OACA,IAAA1C,EACA,IAAA,GAAArE,KAAAqE,GACAA,EAAAZ,eAAAzD,IACAyF,KAAA6L,UAAA3F,IAAA,UAAA3L,EAAAyF,KAAAI,SAMA8W,eAAA,WACAhX,EAAAC,QAAA,OAAAY,QAAA,uBAAAf,KAAAK,MAAAL,KAAA6L,WACA3L,EAAAC,QAAA,gBAAAH,KAAAK,MAAAiB,IAAA,SAAAP,QAAA,uBAAAf,KAAAK,MAAAL,KAAA6L,UAAA7L,MACAE,EAAAC,QAAA,WAAAH,KAAAK,MAAAiB,IAAA,SAAAP,QAAA,uBAAAf,KAAAK,MAAAL,KAAA6L,UAAA7L,OAGAO,SAAA,WAIAL,EAAAC,QAAA,WAAAH,KAAAK,MAAAiB,IAAA,SAAAP,QAAA,iBAAAf,KAAAK,MAAAL,KAAA6L,UAAA7L,MACAE,EAAAC,QAAA,gBAAAH,KAAAK,MAAAiB,IAAA,SAAAP,QAAA,iBAAAf,KAAAK,MAAAL,KAAA6L,UAAA7L,OAGAgB,gBAAA,WACA,GAAAoB,GAAApC,IACA,QACAwY,cAAA,WACA,GAAAxY,KAAApB,KACA,IAAA,GAAArE,KAAAyF,MAAApB,KACA,GAAAoB,KAAApB,KAAAZ,eAAAzD,IACA6H,EAAAyJ,UAAAvK,IAAA/G,KAAAyF,KAAApB,KAAArE,GACA,MAAA,uBAKA,OAAA,IAEAke,cAAA,WAEA,MADAvY,GAAAC,QAAA,OAAAkB,QAAA,eAAA,yBAAArB,KAAA2S,MACA3S,OAGAmB,cAAA,WACA,GAAAC,GAAA,EAWA,YAVA,KAAApB,KAAAuO,MACAnN,GAAApB,KAAAuO,MAEAnN,GAAA,YAGApB,KAAAyW,QACArV,GAAA,aAGAA,GAGAsV,YAAA,WACA,MAAA1W,MAAAyW,MACAzW,KAAAyW,MAEA,MAKAhP,WAAA,SAAAC,EAAA3F,GACAtC,OAAAiI,EAAAzF,IAAAC,KAAA,0BAAAyF,OAAA5F,EAAAE,SC5EAlI,EAAA,6BAAA,WAkDA,MAjDAoP,UAAAC,MAAAxJ,QACAyJ,UACA8K,UAAA,EACA4E,iBAAA,EACAtC,OAAA,GAGA1W,WAAA,WAEAG,EAAAC,QAAA,OAAAY,QAAA,oBAAAf,MACAE,EAAAC,QAAAH,KAAAsB,IAAA,SAAAP,QAAA,oBAAAf,MACAE,EAAAC,QAAA,gBAAAH,KAAAsB,IAAA,SAAAP,QAAA,oBAAAf,MACAA,KAAAM,GAAA,eAAAN,KAAA6pB,eAAA7pB,UAMA,KAAAA,KAAA8D,YAEA9D,KAAAsB,IAAA,uBAAA,KAAAtB,KAAA8D,WAAAkJ,QAAAiS,YACAjf,KAAAC,SAAAC,EAAAC,QAAA,OAAA,kBAAAH,KAAA8pB,YAaAA,UAAA,SAAAtK,GACAtf,EAAAC,QAAA,OAAAY,QAAA,sBAAAye,EAAAxf,OAGA6pB,eAAA,WACA7pB,KAAAsB,IAAA,UACApB,EAAAC,QAAA,UAAAkB,QAAA,gBAAA,WAAArB,KAAAsB,IAAA,QAAA,UACApB,EAAAC,QAAA,OAAAkB,QAAA,uBAAA,WAAArB,KAAAsB,IAAA,QAAA,YAEApB,EAAAC,QAAA,UAAAkB,QAAA,eAAA,WAAArB,KAAAsB,IAAA,QAAA,UACApB,EAAAC,QAAA,OAAAkB,QAAA,sBAAA,WAAArB,KAAAsB,IAAA,QAAA,gBCnDAvH,EAAA,gCAAA,2BAAA,SAAA8P,GAQA,MAPAV,UAAAK,WAAA5J,QACAS,MAAAwJ,EAEA9J,WAAA,SAAAyK,EAAAwC,GACAhN,KAAAgN,QAAAA,WCLAjT,EAAA,4BAAA,uCAAA,gCAAA,SAAAgwB,EAAAC,GAyBA,MAxBAtqB,YAAA5B,OAAA8B,QACAG,WAAA,WACAG,EAAAC,QAAA,YAAAgF,MAAA,uBAAAnF,KAAA0pB,oBAAA1pB,MAEAA,KAAAC,SAAAC,EAAAC,QAAA,YAAA,oBAAAH,KAAAiqB,2BAGAP,oBAAA,SAAArpB,GACA,MAAA0pB,IAUAE,yBAAA,SAAA5pB,GACAA,EAAA6I,IAAA,WAAA,GAAA8gB,GAAA3pB,EAAAiB,IAAA,mBClBAvH,EAAA,mCAAA,WAgCA,MA/BA2F,YAAA5B,OAAA8B,QACAG,WAAA,WAEAG,EAAAC,QAAA,uBAAAgF,MAAA,iBAAA,WAAA,OAAA,IAGAjF,EAAAC,QAAA,UAAAgF,MAAA,uBAAAnF,KAAA+L,cAAA/L,OAaA+L,cAAA,SAAAvN,EAAAihB,EAAAllB,EAAA2vB,GACA,GAAAzqB,OAAAjB,EAAAwP,QAAAua,KAAA,WACA,GAAAtrB,GAAA,MAEA,IAAAA,GAAA,CAGA,OAAAA,QC7BAlD,EAAA,kCAAA,WAqHA,MApHA2F,YAAA5B,OAAA8B,QACAG,WAAA,WAEAC,KAAAC,SAAAC,EAAAC,QAAA,OAAA,aAAAH,KAAA0d,WACA1d,KAAAC,SAAAC,EAAAC,QAAA,OAAA,eAAAH,KAAA4d,aACA5d,KAAAC,SAAAC,EAAAC,QAAA,OAAA,kBAAAH,KAAAmqB,iBAaAzM,UAAA,SAAAlf,EAAA6B,GACA,GAAAqE,GAAAxE,EAAAC,QAAA,OAAAkB,QAAA,qBACA4M,EAAAvJ,EAAApD,IAAA,MACAqR,EAAAzS,EAAAC,QAAA8N,GAAA5M,QAAA,WAAAhB,EAAAiB,IAAA,QACApB,GAAAC,QAAA,OAAAkB,QAAA,cAAA,gBAAAhB,MAAAA,EAAAyU,gBAAAnC,EAAArR,IAAA,oBAWAsc,YAAA,SAAApf,EAAAqN,GACA,GAAA4d,GAAAvpB,EAAAC,QAAA,OAAAkB,QAAA,kBAAAwK,GAGA0I,GACAqV,OAAA/d,EAAAvK,IAAA,cACAiT,MAAA1I,EAAAvK,IAAA,SACA8kB,OAAA,UACAH,SAAA,WAGA5f,GACAvC,WAAA+H,EAAA/H,YAGA4hB,EAAAxlB,EAAAC,QAAA,WAAAkB,QAAA,kBACA8nB,EAAAzD,EAAA1b,OAAA3J,MAAAwL,GAEAzB,GAAAC,KAAA8e,EAAA,SAAAtmB,GACA,GAAAwD,GAAAxD,EAAAvB,IAAA,YACA,KAAA+E,EAAA6d,QACA9Z,EAAAC,KAAAhE,EAAA6d,OAAA,SAAAC,EAAAzmB,GACAymB,EAAA9jB,OAAAwL,IACAxF,EAAA6d,OAAAxmB,GAAA2C,MAAAopB,KAIA5mB,EAAAqG,IAAA,OAAA7C,GACAxD,EAAAqG,IAAA,QAAAugB,GACA5mB,EAAAqG,IAAA,YAAA,KAGAhJ,EAAAC,QAAA,WAAAkB,QAAA,kBAAA,eAAAooB,EAAA,KAAAlV,EAAAlO,EAEA,IAAA3B,GAAAxE,EAAAC,QAAA,OAAAkB,QAAA,qBACA4M,EAAAvJ,EAAApD,IAAA,KACApB,GAAAC,QAAA8N,GAAA5M,QAAA,SAAAwK,IAWAse,eAAA,SAAA3rB,EAAA6B,GACA,GAAAopB,GAAAvpB,EAAAC,QAAA,OAAAkB,QAAA,kBAAAhB,GACAqE,EAAAxE,EAAAC,QAAA,OAAAkB,QAAA,qBACA4M,EAAAvJ,EAAApD,IAAA,KAGAmoB,GAAAvgB,IAAA,QAAAugB,EAAAnoB,IAAA,SAAA,QAEA,IAAA8oB,GAAAlqB,EAAAC,QAAA8N,GAAA5M,QAAA,YACAooB,GAAAvgB,IAAA,KAAAkhB,GAGAlqB,EAAAC,QAAA8N,GAAA5M,QAAA,MAAAooB,GAAA,GAAA,EAAA,YAGA,IAAAlV,IACAqV,OAAAvpB,EAAAiB,IAAA,cACAiT,MAAAlU,EAAAiB,IAAA,SACA8kB,OAAA,aACAH,SAAA,cAGA5f,GACAvC,WAAA5D,EAAAC,QAAA8N,GAAA5M,QAAA,kBAGAnB,GAAAC,QAAA,WAAAkB,QAAA,kBAAA,kBAAAooB,EAAA,KAAAlV,EAAAlO,GAEAhG,EAAAU,QAAA,eAAAV,GAGAH,EAAAC,QAAA,OAAAkB,QAAA,kBC9GAtH,EAAA,6BACA,iCACA,SACA+P,GA6WA,MA3WApK,YAAA5B,OAAA8B,QACAG,WAAA,WACAC,KAAAqqB,qBAAA,GAAAvgB,EACA,IAAA1H,GAAApC,IACAoK,GAAAC,KAAAc,UAAA,SAAAmf,GACA,GAAAA,EAAAC,KACA,GAAAA,GAAA,GAAAzgB,GAAAwgB,EAAAC,UAEA,IAAAA,GAAA,EAGAnoB,GAAAioB,qBAAA3f,KACAhM,GAAA4rB,EAAA5rB,GACA6V,MAAA+V,EAAA/V,MACAgW,KAAAA,EACAtgB,cAAAqgB,EAAArgB,iBAIA,IAAAugB,GAAAxqB,KAAAqqB,qBAAA/oB,IAAA,UAAAA,IAAA,QAEA2H,EAAA/I,EAAAC,QAAA,UAAAkB,QAAA,iBACA+I,GAAAC,KAAApB,EAAAuB,OAAA,SAAA2Z,GAEA,WAAAA,EAAA7iB,IAAA,SACAkpB,EAAA9f,KACAhM,GAAAylB,EAAA7iB,IAAA,MACAiT,MAAA4P,EAAA7iB,IAAA,SACAmpB,IAAAroB,EAAAsoB,kBAAAvG,EAAA7iB,IAAA,WAKA,IAAAqpB,GAAA,GAAA7gB,GAEArI,EAAAvB,EAAAC,QAAA,OAAAkB,QAAA,iBACAupB,EAAAnpB,EAAAH,IAAA,YAAAA,IAAA,eACA8I,GAAAC,KAAAugB,EAAApgB,OAAA,SAAAqgB,GACAF,EAAAjgB,KACA6J,MAAAsW,EAAAvpB,IAAA,QACAmpB,IAAA,SAAAI,EAAAvpB,IAAA,QAAA,QAIAtB,KAAAqqB,qBAAA/oB,IAAA,SAAA4H,IAAA,OAAAyhB,GAEA3qB,KAAA8qB,kBACA9qB,KAAA6J,gBACA7J,KAAAqV,MAAA,EAKArV,KAAAC,SAAAC,EAAAC,QAAA,aAAA,iBAAAH,KAAA+qB,eACA/qB,KAAAC,SAAAC,EAAAC,QAAA,UAAA,YAAAH,KAAAgrB,cACAhrB,KAAAC,SAAAC,EAAAC,QAAA,UAAA,eAAAH,KAAAirB,iBACAjrB,KAAAC,SAAAC,EAAAC,QAAA,gCAAA,gBAAAH,KAAAkrB,gBACAlrB,KAAAC,SAAAC,EAAAC,QAAA,gCAAA,gBAAAH,KAAAkrB,gBAGAhrB,EAAAC,QAAA,aAAAgF,MAAA,wBAAAnF,KAAAmrB,qBAAAnrB,MACAE,EAAAC,QAAA,aAAAgF,MAAA,wBAAAnF,KAAAorB,qBAAAprB,MAGAE,EAAAC,QAAA,aAAAgF,MAAA,iBAAAnF,KAAA8lB,cAAA9lB,MACAE,EAAAC,QAAA,aAAAgF,MAAA,eAAAnF,KAAAqrB,gBAAArrB,MAGAA,KAAAC,SAAAC,EAAAC,QAAA,mBAAA,iBAAAH,KAAAsrB,UAGAtrB,KAAAC,SAAAC,EAAAC,QAAA,oBAAA,iBAAAH,KAAA8pB,WAGA9pB,KAAAC,SAAAC,EAAAC,QAAA,OAAA,mBAAAH,KAAAurB,iBAGArrB,EAAAC,QAAA,OAAAgF,MAAA,qBAAAnF,KAAA0qB,kBAAA1qB,OAoBAwrB,cAAA,SAAA9Q,GACA,GAAA+Q,GAAAvrB,EAAAC,QAAA,aAAAkB,QAAA,YACAe,EAAApC,IAMAA,MAAA0rB,SACA,IAAAtpB,GAAApC,IAEAP,QAAAib,EAAAzY,IAAAC,KAAA,eAAAmI,KAAA,WACA,OAAA,KAAA5K,OAAAO,MAAAqG,KAAA,WAAA,CACA,GAAAgR,GAAA5X,OAAAO,MAAAqX,KAAA,WACAoF,MAAA,mBACA1b,QAAA,QACAkG,UACAyV,EAAA,SACAC,EAAA,UAEAnF,aAAA,OACAmU,YAAA,EACApU,MAAA,gBACAqU,UAAA,IAEAC,OAAA,WACAJ,EAAA7hB,SAAA8Q,EAAAra,OACAL,KAAA8c,WAAArd,OAAA,uBACA,IAAAqrB,GAAArrB,OAAAO,KAAAgO,QAAA8d,KAAA,WACA,IAAAhB,EAAApvB,SACAovB,EAAArrB,OAAAib,EAAAzY,IAAAC,KAAA,aAGAE,EAAAgpB,qBAAA1Q,EAAAra,OACA+B,EAAA+oB,qBAAAL,IAGAiB,QAAA,cAKAtsB,QAAAO,MAAAqG,KAAA,UAAAgR,EAAA3Y,QAKAqsB,cAAA,SAAAvsB,EAAAwtB,GAOA,OAAA,KAAAhsB,KAAA6J,aAAAvI,IAAA,iBAAA,gBAAAtB,KAAA6J,aAAAvI,IAAA,gBAAAA,IAAA,QAAA,CAEAgX,QAAAC,IAAAyT,EAEA,IAAAC,GAAAxsB,OAAAO,KAAA8qB,gBAAAzb,MACA6c,EAAAzsB,OAAAO,KAAA8qB,gBAAAqB,QACAC,EAAAF,EAAAF,EAAA1qB,IAAA,OAAA5F,OAEA+uB,MAAA,KAAAuB,EAAA1qB,IAAA,WAAA0qB,EAAA1qB,IAAA,WAAA0qB,EAAA1qB,IAAA,MAEA2qB,GAAAA,EAAAI,OAAA,EAAAH,GAAAzB,EAAAwB,EAAAI,OAAAH,GACAzsB,OAAAO,KAAA8qB,gBAAAzb,IAAA4c,GAAAE,MAAAC,GAAArrB,QAAA,cACA,IAAA,OAAAf,KAAA6J,aAAAvI,IAAA,QACA7B,OAAAO,KAAA8qB,gBAAAwB,WAAA,aAAAN,EAAA1qB,IAAA,YACA,CACA,GAAA2qB,GAAAxsB,OAAAO,KAAA8qB,gBAAAzb,MACA6c,EAAAzsB,OAAAO,KAAA8qB,gBAAAqB,QACAC,EAAAF,EAAAF,EAAA1qB,IAAA,OAAA5F,MACAuwB,GAAAA,EAAAI,OAAA,EAAAH,GAAAF,EAAA1qB,IAAA,OAAA2qB,EAAAI,OAAAH,GACAzsB,OAAAO,KAAA8qB,gBAAAzb,IAAA4c,GAAAE,MAAAC,GAAArrB,QAAA,YAIAiqB,aAAA,SAAAvL,GAEA,WAAAA,EAAAne,IAAA,SACAtB,KAAAqqB,qBAAA/oB,IAAA,UAAAA,IAAA,QAAAoJ,KACAhM,GAAA+gB,EAAAne,IAAA,MACAiT,MAAAkL,EAAAne,IAAA,SACAmpB,IAAAzqB,KAAA0qB,kBAAAjL,EAAAne,IAAA,QACAirB,QAAAvsB,KAAAwsB,sBAAA/M,EAAAne,IAAA,WAKA2pB,gBAAA,SAAAxL,GACA,GAAAgN,GAAAhN,EAAAne,IAAA,MACA0qB,EAAAhsB,KAAAqqB,qBAAA/oB,IAAA,UAAAA,IAAA,QAAAA,IAAAmrB,EACAzsB,MAAAqqB,qBAAA/oB,IAAA,UAAAA,IAAA,QAAAgJ,OAAA0hB,IAGAd,eAAA,SAAAwB,GACA,GAAA/B,GAAA,GAAA7gB,GAEArI,EAAAvB,EAAAC,QAAA,OAAAkB,QAAA,iBACAupB,EAAAnpB,EAAAH,IAAA,YAAAA,IAAA,eAEA8I,GAAAC,KAAAugB,EAAApgB,OAAA,SAAAmiB,GACAhC,EAAAjgB,KACA6J,MAAAoY,EAAArrB,IAAA,QACAmpB,IAAA,SAAAkC,EAAArrB,IAAA,QAAA,QAIAtB,KAAAqqB,qBAAA/oB,IAAA,SAAA4H,IAAA,OAAAyhB,IAGAiC,cAAA,SAAApuB,GACA,YAAAiB,OAAAjB,EAAAwP,QAAA,GAAAnO,SAAA,SAAAJ,OAAAjB,EAAAwP,QAAA,GAAAnO,SACAJ,OAAAjB,EAAAwP,QAAAlI,SAAA5D,KAAA,eAAAic,SAIA0O,gBAAA,SAAAruB,GACA,GAAAwB,KAAAqV,KAAA,CACA7W,EAAAsuB,gBACA,IAAAC,GAAA/sB,KAAAkkB,OAAAla,OAAAlB,QAAA,IAAA,EACAikB,IACA/sB,KAAA+qB,cAAAvsB,EAAAuuB,KAKAC,YAAA,SAAAxuB,GACAwB,KAAAqV,OACA7W,EAAAsuB,iBACA9sB,KAAAitB,gBAAA,QAIAC,cAAA,SAAA1uB,GACAwB,KAAAqV,OACA7W,EAAAsuB,iBACA9sB,KAAAitB,gBAAA,UAIAA,gBAAA,SAAAE,GACA,GAAA,QAAAA,EACA,GAAAC,GAAA,MAEA,IAAAA,IAAA,CAGA,IAAA,EAAAptB,KAAAkkB,OAAAla,OAAAlB,QAAA,IAAApN,OAAA,CACA,GAAAqxB,GAAA/sB,KAAAkkB,OAAAla,OAAAlB,QAAA,IAAA,GACAukB,EAAArtB,KAAAkkB,OAAA/nB,QAAA4wB,EACAA,GAAA7jB,IAAA,UAAA,EAEA,IAAAokB,GAAAttB,KAAAkkB,OAAA1Z,OAAA6iB,EAAAD,EACAE,IACAA,EAAApkB,IAAA,UAAA,OAKA,GAAAlJ,KAAAkkB,OAAAla,OAAAlB,QAAA,IACAwP,QAAAC,IAAA,UACA,EAAAvY,KAAAutB,SAAAvjB,OAAAlB,QAAA,IACAwP,QAAAC,IAAA,YAGA,EAAAvY,KAAAkkB,OAAA1Z,OAAA9O,OAEAsE,KAAAkkB,OAAA1Z,OAAA,GAAAtB,IAAA,UAAA,GAGAlJ,KAAAwtB,OAAAhjB,OAAA,GAAAtB,IAAA,UAAA,IAKAiiB,qBAAA,SAAA7Z,GACAtR,KAAA8qB,eAAAxZ,GAGA8Z,qBAAA,SAAAvhB,GACA7J,KAAA6J,aAAAA,GAGAic,cAAA,WACA,MAAA9lB,MAAAqqB,sBAGAgB,gBAAA,SAAA3sB,GACA,MAAAsB,MAAAqqB,qBAAA/oB,IAAA5C,IAGA+uB,WAAA,SAAApY,GACArV,KAAAqV,KAAAA,EACAjL,EAAAC,KAAArK,KAAAqqB,qBAAA/oB,IAAA,UAAAkJ,OAAA,SAAAnK,GACAA,EAAA6I,IAAA,UAAA,MAKAoiB,SAAA,SAAA7L,GAGA,GAAAiO,GAAA1tB,KAAA0qB,kBAAAjL,EAAAne,IAAA,QAGAqsB,EAAA3tB,KAAAqqB,qBAAA/oB,IAAA,UAAAA,IAAA,QAAAY,KAAA,SAAA0rB,GACA,MAAAF,IAAAE,EAAAtsB,IAAA,aAIA,KAAAqsB,GAGAA,EAAAzkB,IAAA,KAAAuW,EAAAne,IAAA,QAGAwoB,UAAA,SAAArK,GACA,GAAAoO,GAAApO,EAAAne,IAAA,OACAqsB,EAAA3tB,KAAAqqB,qBAAA/oB,IAAA,UAAAA,IAAA,QAAAA,IAAAme,EAAAne,IAAA,WACA,KAAAqsB,GACAA,EAAAzkB,IAAA,MAAAlJ,KAAA0qB,kBAAAmD,KAKAnD,kBAAA,SAAAjc,GACA,MAAA,UAAAA,EAAA,KAGA+d,sBAAA,SAAA/d,GACA,MAAA,UAAAA,EAAA,UAGA8c,gBAAA,SAAA1f,EAAA2T,EAAA3V,GACA,GAAAikB,GAAA9tB,KAAA0qB,kBAAAlL,EAAAuO,oBAAA,KACAF,EAAA7tB,KAAA0qB,kBAAAlL,EAAAle,IAAA,QACAid,EAAA1U,EAAAvI,IAAA,QACA0sB,EAAAniB,EAAAvK,IAAAid,EACA,IAAA,gBAAAA,OAAA,KAAA1S,EAAAvK,IAAA,gBAAA,CAgBA,MAfAuK,GAAAvK,IAAA,gBACA+I,KAAA,SAAAhK,GACA,GAAA4tB,GAAAH,EAAA/xB,MAAA,EAAA+xB,EAAApyB,OAAA,GAAA,SACAwyB,EAAAL,EAAA9xB,MAAA,EAAA8xB,EAAAnyB,OAAA,GAAA,QAEA,IAAA,iBADAsyB,EAAA3tB,EAAAiB,IAAA,OACA,CACA,GAAA6sB,GAAA,GAAAC,QAAAH,EAAA,KACAI,EAAAL,EAAAlyB,QAAAqyB,EAAAD,EACAC,GAAA,GAAAC,QAAAN,EAAA,KAGAO,EAAAA,EAAAvyB,QAAAqyB,EAAAN,GACAxtB,EAAA6I,IAAA,KAAAmlB,OAGA,EAEA,GAAA,gBAAAL,GAAA,CACA,GAAAG,GAAA,GAAAC,QAAAN,EAAA,IACAO,QAAAL,EAAAlyB,QAAAqyB,EAAAN,GACAhiB,EAAA3C,IAAAqV,EAAA8P,cC9WAt0B,EAAA,uCAAA,4BAAA,SAAAwP,GAIA,MAHAJ,UAAAK,WAAA5J,QACAS,MAAAkJ,MCFAxP,EAAA,+BAAA,WAcA,MAbA2F,YAAAC,SAAAC,QACAC,QAAA,KACAC,SAAA,6BAEAc,QACAud,MAAA,aAGAmQ,UAAA,WACApuB,EAAAC,QAAA,aAAAkB,QAAA,aAAArB,KAAAK,MAAAiB,IAAA,aCVAvH,EAAA,iCAAA,6BAAA,SAAAw0B,GAkCA,MAjCA7uB,YAAAoC,eAAAlC,QACAC,QAAA,KACAkC,UAAAwsB,EAEAxuB,WAAA,WACAG,EAAAC,QAAA,cAAAgF,MAAA,iBAAAnF,KAAAwuB,cAAAxuB,MACAE,EAAAC,QAAA,cAAAgF,MAAA,eAAAnF,KAAAyuB,aAAAzuB,OAGA0uB,OAAA,SAAAC,EAAAjxB,EAAAoG,GACA,MAAA,UAAA6qB,EAAArtB,IAAA,YAGAktB,cAAA,SAAAjZ,GACAvV,KAAA0uB,OAAA,SAAAC,EAAAjxB,EAAAoG,GACA,MAAAyR,IAAAoZ,EAAArtB,IAAA,YAEAtB,KAAAI,SACAF,EAAAC,QAAA,cAAAY,QAAA,uBAGA0tB,aAAA,SAAAG,GACA5uB,KAAA0uB,OAAA,SAAAC,EAAAjxB,EAAAoG,GACA,GAAAyQ,GAAAoa,EAAArtB,IAAA,SAAAutB,cAAA1yB,QAAAyyB,EAAAC,cAAA/yB,QAAA,IAAA,MAAA,EACA2uB,EAAAkE,EAAArtB,IAAA,OAAAutB,cAAA1yB,QAAAyyB,EAAAC,gBAAA,CACA,OAAAta,IAAAkW,GAEAzqB,KAAAI,SACAF,EAAAC,QAAA,cAAAY,QAAA,2BC7BAhH,EAAA,oCAAA,WA+BA,MA9BA2F,YAAAC,SAAAC,QACAC,QAAA,KACAC,SAAA,iCACAc,QACAud,MAAA,WAGApe,WAAA,WACAC,KAAAC,SAAAC,EAAAC,QAAA,cAAA,qBAAAH,KAAA8uB,eAGAC,QAAA,WACA/uB,KAAAgvB,aACAhvB,KAAAivB,aAGAD,WAAA,WACA9uB,EAAAC,QAAA,cAAAkB,QAAA,iBAAArB,KAAAK,MAAAiB,IAAA,QAGA2tB,UAAA,WACAjvB,KAAAQ,IAAA4L,SAAA,UACApM,KAAAQ,IAAA0uB,WAAAxhB,YAAA,WAGAohB,aAAA,WACA9uB,KAAAQ,IAAAkN,YAAA,eC3BA3T,EAAA,sCAAA,kCAAA,SAAAo1B,GAeA,MAdAzvB,YAAAoC,eAAAlC,QACAC,QAAA,KACAkC,UAAAotB,EAEApvB,WAAA,WACAC,KAAAC,SAAAC,EAAAC,QAAA,cAAA,OAAAH,KAAAI,OAAAJ,OAIA0uB,OAAA,SAAAC,EAAAjxB,EAAAoG,GACA,MAAA,GAAA6qB,EAAArtB,IAAA,QAAA5F,YCXA3B,EAAA,qCAAA,WA0BA,MAzBA2F,YAAAC,SAAAC,QACAE,SAAA,gCACAc,QACAwuB,cAAA,gBAEAC,aAAA,SAAAC,GAEA,GAAA,IAAAA,EAAApgB,QAAA,CAEA,GAAAqgB,GAAA9vB,OAAA,8CAAAyiB,QAAA7b,KAAA,MASA,OAPAnG,GAAAC,QAAA,aAAAkB,QAAA,aAAAkuB,GAGA9vB,OAAA,mBAAAuH,IAAA,UAAA,QACAvH,OAAA,mBAAAiO,cACAjO,OAAA,oBAAAiO,YAAA,uBACAjO,QAAA,4BAAAiO,YAAA,2BAGA,GAAAzQ,GAAA+C,KAAAQ,IAAA0B,KAAA,SAAAmN,KACAnP,GAAAC,QAAA,cAAAkB,QAAA,eAAApE,QCtBAlD,EAAA,kCAAA,WAYA,MAXA2F,YAAA6D,WAAA3D,QACAqC,GAAA,kBACAnC,SAAA,yBAEA0D,SACAkrB,OAAA,oBACAc,SAAA,sBACAjF,KAAA,uBCPAxwB,EAAA,+BACA,2BACA,sCACA,4BACA,gCACA,iCACA,qCACA,kCACA,gCACA,SACA01B,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,GAogBA,MAlgBAtwB,YAAA5B,OAAA8B,QAEAusB,MAAA,EACA8D,IAAA,GAEAlwB,WAAA,WAEAC,KAAAC,SAAAC,EAAAC,QAAA,UAAA,sBAAA,WACAV,OAAA,eAAAyG,IAAA,SACAzG,OAAA,eAAAa,GAAA,QAAAN,KAAAkwB,wBAGAlwB,KAAAC,SAAAC,EAAAC,QAAA,OAAA,iBAAAH,KAAAmwB,eACAnwB,KAAAC,SAAAC,EAAAC,QAAA,OAAA,uBAAAH,KAAAowB,qBACApwB,KAAAC,SAAAC,EAAAC,QAAA,UAAA,eAAAH,KAAAqwB,kBAEA,IAAAjuB,GAAApC,IACAE,GAAAC,QAAA,aAAAgF,MAAA,YAAA,SAAA8B,GACA7E,EAAA+pB,MAAAllB,IAEA/G,EAAAC,QAAA,aAAAgF,MAAA,YAAA,WACA,MAAA/C,GAAA+pB,OAGA,IAAA/pB,GAAApC,IACAE,GAAAC,QAAA,aAAAgF,MAAA,UAAA,SAAAlI,GACAmF,EAAA6tB,IAAAhzB,IAEAiD,EAAAC,QAAA,aAAAgF,MAAA,UAAA,WACA,MAAA/C,GAAA6tB,MAGA/vB,EAAAC,QAAA,aAAAgF,MAAA,aAAAnF,KAAAsuB,UAAAgC,KAAAtwB,OAGAA,KAAAC,SAAAC,EAAAC,QAAA,mBAAA,aAAA,SAAAE,GACA,GAAAkwB,GAAA,IAAAlwB,EAAAslB,IAAA,gCACAlmB,QAAA8wB,GAAAjwB,GAAA,QAAA,SAAAgvB;kCACAltB,EAAAouB,cAAAlB,EAAAiB,EAAA,qBAEA9wB,OAAA8wB,GAAAjwB,GAAA,QAAA,SAAAgvB,GACAltB,EAAAquB,cAAAnB,EAAAiB,EAAA,qBAEA9wB,OAAA8wB,GAAArB,SAAA,gCAAAhpB,IAAA,SACAzG,OAAA8wB,GAAArB,SAAA,gCAAA5uB,GAAA,QAAAN,KAAAkwB,wBAEAlwB,KAAAC,SAAAC,EAAAC,QAAA,UAAA,SAAA,WACAV,OAAA,gCAAAyG,IAAA,SACAzG,OAAA,gCAAAa,GAAA,QAAAN,KAAAkwB,wBAIAlwB,KAAAC,SAAAC,EAAAC,QAAA,+BAAA,iBAAAH,KAAAyY,eAIAzY,KAAAC,SAAAC,EAAAC,QAAA,UAAA,SAAA,WACAV,OAAA,6CAAAyG,IAAA,SACAzG,OAAA,6CAAAa,GAAA,QAAAN,KAAAkwB,wBAIAlwB,KAAAC,SAAAC,EAAAC,QAAA,cAAA,QAAA,SAAA3B,EAAA+xB,GACAnuB,EAAAouB,eAAA,EAAAD,EAAA,SAEAvwB,KAAAC,SAAAC,EAAAC,QAAA,cAAA,UAAA,SAAA3B,EAAA+xB,GACA9wB,OAAA8wB,GAAAG,QAAA,eAAAxuB,KAAA,YAAAoqB,WAAA,eAEAtsB,KAAAC,SAAAC,EAAAC,QAAA,cAAA,QAAA,SAAA3B,EAAA+xB,GACAnuB,EAAAquB,cAAAjyB,EAAA+xB,EAAA,SAEAvwB,KAAAC,SAAAC,EAAAC,QAAA,UAAA,SAAA,WACAV,OAAA,4BAAAyG,IAAA,SACAzG,OAAA,4BAAAa,GAAA,QAAAN,KAAAkwB,wBAGAzwB,OAAAsoB,UAAAznB,GAAA,QAAA,SAAAgvB,GACA,IAAAA,EAAApgB,UACAhP,EAAAC,QAAA,aAAAkB,QAAA,aAAA,IAEA5B,OAAA,mBAAAuH,IAAA,UAAA,QACA9G,EAAAC,QAAA,UAAAkB,QAAA,gBACA5B,OAAA,mBAAAiO,cACAjO,OAAA,oBAAA6P,OACA7P,OAAA,oBAAAiO,YAAA,mBACAjO,OAAA,4BAAAiO,YAAA,8BAOA1N,KAAAC,SAAAkJ,SAAAwnB,MAAAxwB,QAAA,UAAA,YAAAH,KAAAmwB,eACAnwB,KAAAC,SAAAkJ,SAAAwnB,MAAAxwB,QAAA,UAAA,eAAAH,KAAAmwB,eACAnwB,KAAAC,SAAAkJ,SAAAwnB,MAAAxwB,QAAA,oBAAA,iBAAAH,KAAAmwB,eAGAnwB,KAAAC,SAAAkJ,SAAAwnB,MAAAxwB,QAAA,SAAA,cAAAH,KAAAmwB,eAEAnwB,KAAAC,SAAAkJ,SAAAwnB,MAAAxwB,QAAA,OAAA,uBAAAH,KAAAmwB,gBAGAA,cAAA,WAEA,GAAAzrB,GAAAyE,SAAAwnB,MAAAxwB,QAAA,OAAAkB,QAAA,qBAEAyI,EAAA5J,EAAAC,QAAA,aAAAkB,QAAA,kBACA8J,IACArB,GAAAO,KAAA,SAAAkL,GAEAA,EAAAjU,IAAA,QAAA+I,KAAA,SAAAogB,GAEA,UAAA/lB,EAAApD,IAAA,OAAA,yBAAAmpB,EAAAnpB,IAAA,QAEA6J,EAAAxO,MACA4X,MAAAkW,EAAAnpB,IAAA,SACAmpB,IAAAA,EAAAnpB,IAAA,OACAiU,QAAAA,EAAAjU,IAAA,WAIA,IAAAsvB,GAAA,GAAAZ,EACAY,GAAAxwB,QACA,IAAAywB,GAAA,GAAAnB,GAAAvkB,GACA2lB,EAAA,GAAAlB,IACA9rB,WAAA+sB,IAEAE,EAAA,GAAAjB,IACAhsB,WAAAgG,GAGA8mB,GAAAI,UAAA,QAAAntB,KAAAitB,GACAF,EAAAI,UAAA,YAAAntB,KAAAktB,GACAH,EAAAI,UAAA,UAAAntB,KAAA,GAAAksB,KAGAK,oBAAA,SAAAvmB,EAAAgC,GACA,OAAA,KAAAhC,EAAAvI,IAAA,mBACAuI,EAAAvI,IAAA,kBAAA,CACA,GAAA/G,GAAAsP,EAAAvI,IAAA,OACAtB,MAAAC,SAAAC,EAAAC,QAAA,WAAA5F,GAAA,iBAAAyF,KAAAyY,iBAGAA,cAAA,SAAA5O,EAAAgC,EAAA6O,GAEAA,EAAAla,IAAA0B,KAAA,eAAAgE,IAAA,SACAwU,EAAAla,IAAA0B,KAAA,eAAA5B,GAAA,QAAAN,KAAAkwB,sBAEA,GAAAzwB,OAAA,mBAAA/D,QAAAsE,KAAAmwB,gBAGA1wB,OAAA,cAAAa,GAAA,SAAA,WAEA,GAAA,GAAAb,OAAA,oBAAA/D,OAAA,CAEA,GAAAu1B,GAAAxxB,OAAA,oBAAAixB,QAAA,eAAAxuB,KAAA,eACA,IAAA,GAAA+uB,EAAAv1B,OACA,GAAAw1B,GAAAD,EAAAvqB,SAAAD,IAAAhH,OAAA4F,QAAA+B,YACAR,EAAAqqB,EAAAE,kBAEA,IAAAD,GAAAzxB,OAAA,oBAAAiH,SAAAD,IAAAhH,OAAA4F,QAAA+B,YACAR,EAAAnH,OAAA,oBAAA0xB,aAEA1xB,QAAA,mBAAAuH,IAAA,MAAAkqB,EAAAtqB,EAEA,IAAAwqB,GAAA3xB,OAAA,mBAAA0xB,aACA1xB,QAAA,cAAAuH,IAAA,iBAAAoqB,EAAA,KAEA,IAAAC,GAAA5xB,OAAA,oBAAAixB,QAAA,yBACA,IAAA,GAAAW,EAAA31B,OAAA,CACA,GAAAqL,GAAAsqB,EAAA3qB,SAAAK,KAAAtH,OAAA4F,QAAAisB,YACA7xB,QAAA,mBAAAuH,IAAA,OAAAD,OACA,CACA,GAAAwqB,GAAA9xB,OAAA,oBAAAixB,QAAA,gBAAAhqB,SAAAK,KAAAtH,OAAA4F,QAAAisB,YACA7xB,QAAA,mBAAAuH,IAAA,OAAAuqB,GACA9xB,OAAA,mBAAAuH,IAAA,QAAAvH,OAAA,oBAAAixB,QAAA,gBAAAniB,aAKA9O,OAAAib,EAAAzY,IAAAC,KAAA,YAAA5B,GAAA,QAAAN,KAAAwwB,eAIA/wB,OAAAib,EAAAzY,IAAAC,KAAA,YAAA5B,GAAA,QAAAN,KAAAywB,gBAIAJ,kBAAA,WACA5wB,OAAA,mBAAAuH,IAAA,UAAA,QACA9G,EAAAC,QAAA,UAAAkB,QAAA,iBAIAitB,UAAA,SAAA7D,GAEA,GAAA+G,GAAA/xB,OAAA,mBAQA,IANA,GAAA+xB,EAAAd,QAAA,eAAAxO,QAAAhgB,KAAA,kBAAAxG,SACA81B,EAAAA,EAAAd,QAAA,eAAAxO,QAAAhgB,KAAA,mBAGA,EAAAsvB,EAAA91B,SAAA81B,EAAAA,EAAAtP,SAEAsP,EAAAC,SAAA,iBACA,GAAAC,GAAAF,EAAAd,QAAA,eAAAxuB,KAAA,YAAAoqB,WAAA,YAEA,IAAAoF,GAAAF,EAAAniB,KAWA,KARA,GAAAnN,GAAAhC,EAAAC,QAAA,aAAAkB,QAAA,WACAvF,EAAA2uB,EACAkH,EAAAzxB,EAAAC,QAAA,aAAAkB,QAAA,aAEAuwB,EAAA,2BAIAC,MAAAD,EAAAE,KAAAJ,IACA,GAAAxvB,GAAA2vB,MAAA,GAAA,CACA,GAAAE,GAAAL,EAAA31B,MAAA,EAAA81B,MAAAn0B,OAAA5B,EAAA41B,EAAA31B,MAAA61B,EAAA/2B,UAEA,IAAA22B,EAAAC,SAAA,iBAAA,CACAD,EAAAd,QAAA,eAAAxuB,KAAA,YAAAoqB,WAAA,OAAAyF,EAGA,IAAA9vB,GAAAuvB,EACAQ,EAAA,IACA5nB,GAAAC,KAAApI,EAAA,GAAAgwB,WAAA,SAAAC,EAAAx0B,GACA,IAAAs0B,IACAE,EAAAC,WAAAD,EAAAE,WAAA,CACA,GAAAF,EAAAC,UACA,GAAAl1B,GAAAi1B,EAAAC,cACA,IAAAD,EAAAE,UACA,GAAAn1B,GAAAi1B,EAAAE,SAGA,KAAA,GAAAn1B,EAAAd,QAAAL,GAAA,CAEAmB,EAAAA,EAAAnB,QAAA,UAAA,IACA,IAAAmL,GAAAhK,EAAAd,QAAAL,GAAAoG,EAAAxG,QAMA,GAAAi2B,IACAA,EAAA10B,EAAAd,QAAAL,GAAA,GAGA61B,GAAA1qB,IAAA+qB,EAAA/vB,EAAA,GAAAgwB,WAAAv0B,QAEAs0B,IAAAA,EAAA/vB,EAAA,GAAAgwB,WAAA,GACA,IAAAvrB,GAAAirB,EAAAzvB,EAAAxG,OAAAI,EAAAJ,OACA22B,EAAAtK,SAAAuK,cACAC,EAAAltB,OAAAmtB,cACA,IAAA,GAAAR,EAAAC,WAAAv2B,OACA,IACA22B,EAAAI,SAAAT,EAAAC,WAAA,GAAAvrB,GACA,MAAAgsB,GACApa,QAAAC,IAAAyZ,GACA1Z,QAAAC,IAAA,aAIA,KACA8Z,EAAAI,SAAAT,EAAAtrB,GACA,MAAAgsB,GACApa,QAAAC,IAAA,SAIA8Z,EAAAM,UAAA,GACAJ,EAAAK,kBACAL,EAAAM,SAAAR,OAIAb,GAAAniB,IAAA0iB,GACAP,EAAApL,SACAoL,EAAArF,MAAAwF,EAAAzvB,EAAAxG,OAAAI,EAAAJ,QAKA+D,OAAA,mBAAAuH,IAAA,UAAA,QACA9G,EAAAC,QAAA,UAAAkB,QAAA,gBACAmwB,EAAA9jB,YAAA,mBACA8jB,EAAAd,QAAA,4BAAAhjB,YAAA,4BAGAwiB,qBAAA,SAAA1xB,GAEA,GAAAs0B,GAAArzB,OAAAO,KAEA,IAAA8yB,EAAA5D,WAAAuC,SAAA,mBAMA,MALAvxB,GAAAC,QAAA,aAAAkB,QAAA,aAAA,IACA5B,OAAA,mBAAAuH,IAAA,UAAA,QACA9G,EAAAC,QAAA,UAAAkB,QAAA,gBACA5B,OAAA,oBAAAiO,YAAA,uBACAjO,QAAA,4BAAAiO,YAAA,0BAIA,IAAA,IAAAolB,EAAApC,QAAA,8BAAAxuB,KAAA,eAAAxG,OAAA,CACA,GAAAq3B,GAAAD,EAAApC,QAAA,gBAAAxB,SAAA,YAAAhN,OACA4Q,GAAApC,QAAA,eAAAxuB,KAAA,YAAAoqB,WAAA,aAAA,KAEApsB,EAAAC,QAAA,aAAAkB,QAAA,aAAA,OACA,CACA,GAAA0xB,GAAAD,EAAA5D,SAAA,YAAAhN,QACA9J,EAAA2a,EAAA1jB,OAAA,EACA0jB,GAAA1jB,IAAA+I,EAAA,KAAAgO,SACAlmB,EAAAC,QAAA,aAAAkB,QAAA,YAAA+W,EAAA1c,OAAA,GAGAo3B,EAAAhtB,SAAA2rB,SAAA,cAIAvxB,EAAAC,QAAA,aAAAkB,QAAA,UAAA,KAEA0xB,EAAA3mB,SAAA,kBAGA,IAAA4mB,GAAAF,EAAAvK,KAAA,eACAuK,GAAAvK,KAAA,eAAA,OACAuK,EAAAzsB,KAAA,eAAA2sB,EAEA,IAAAC,GAAAH,EAAApC,QAAA,6BACA,IAAAuC,EAAA/wB,KAAA,gBAAAxG,OACAu3B,EAAA/wB,KAAA,gBAAAkK,SAAA,2BAEA6mB,EAAA7mB,SAAA,2BAGA3M,OAAA,mBAAAuH,IAAA,UAAA,SACA9G,EAAAC,QAAA,UAAAkB,QAAA,iBAEA5B,OAAA,4BAAAyG,IAAA,SACAzG,OAAA,4BAAAa,GAAA,QAAA,SAAA9B,GACAiB,OAAAjB,EAAAwP,QAAAyjB,SAAA,iBACAvxB,EAAAC,QAAA,aAAAkB,QAAA,aAAA,IACA5B,OAAA,mBAAAuH,IAAA,UAAA,QACA9G,EAAAC,QAAA,UAAAkB,QAAA,gBACA5B,OAAA,mBAAAiO,cACAjO,OAAA,oBAAAiO,YAAA,mBACAjO,OAAA,4BAAAiO,YAAA,8BAIArO,WAAA,WACAI,OAAA,mBAAAyC,KAAA,qBAAAA,KAAA,SAAAoM,SACA,MAGAkiB,cAAA,SAAAhyB,EAAAwP,EAAA2E,GAEA,GAAAA,GAAAA,GAAA,UACAmgB,MAAA,KAAA9kB,EAAAvO,OAAAO,MAAAP,OAAAuO,EAOA,IALAvO,OAAA,oBAAA4K,KAAA,SAAA3M,EAAAuE,GACAjC,MAAAiC,GACAA,EAAAyL,YAAA,qBAGA,OAAAiF,EACA,GAAAue,GAAA4B,EAAApC,QAAA,eAAAxuB,KAAA,gBAAAwE,SAAAD,IAAAhH,OAAA4F,QAAA+B,YACAR,EAAAksB,EAAApC,QAAA,eAAAxuB,KAAA,gBAAAivB,kBAEA,IAAAD,GAAA4B,EAAApsB,SAAAD,IAAAhH,OAAA4F,QAAA+B,YACAR,EAAAksB,EAAA3B,aAEA1xB,QAAA,mBAAAuH,IAAA,MAAAkqB,EAAAtqB,EAEA,IAAAyqB,GAAAyB,EAAApC,QAAA,yBACA,IAAA,GAAAW,EAAA31B,OAAA,CACA,GAAAqL,GAAAsqB,EAAA3qB,SAAAK,KAAAtH,OAAA4F,QAAAisB,YACA7xB,QAAA,mBAAAuH,IAAA,OAAAD,OACA,IAAA,OAAA4L,EAAA,CACA,GAAA4e,GAAAuB,EAAApC,QAAA,eAAAxuB,KAAA,gBAAAwE,SAAAK,KAAAtH,OAAA4F,QAAAisB,YACA7xB,QAAA,mBAAAuH,IAAA,OAAAuqB,GACA9xB,OAAA,mBAAAuH,IAAA,QAAA8rB,EAAApC,QAAA,eAAAxuB,KAAA,gBAAAqM,aAGA,CACA,GAAAgjB,GAAA9xB,OAAAO,MAAA0wB,QAAA,gBAAAhqB,SAAAK,KAAAtH,OAAA4F,QAAAisB,YACA7xB,QAAA,mBAAAuH,IAAA,OAAAuqB,GACA9xB,OAAA,mBAAAuH,IAAA,QAAA8rB,EAAApC,QAAA,gBAAAniB,SAGA,GAAA2kB,GAAAzzB,OAAAO,MAAAqG,KAAA,OAQAoqB,cAAA,SAAAnB,EAAAthB,EAAA2E,GAEA,GAAAA,GAAAA,GAAA,SAEA,IAAA,IAAA2c,EAAApgB,QAAA,CAGA,GAAAqgB,GAAA9vB,OAAA,8CAAAyiB,QAAA7b,KAAA,MAWA,OATAnG,GAAAC,QAAA,aAAAkB,QAAA,aAAAkuB,GAGA9vB,OAAA,mBAAAuH,IAAA,UAAA,QACA9G,EAAAC,QAAA,UAAAkB,QAAA,gBACA5B,OAAA,mBAAAiO,cACAjO,OAAA,oBAAAiO,YAAA,uBACAjO,QAAA,4BAAAiO,YAAA,2BAUA,OAAA,KAAAM,EACA,GAAA8kB,GAAArzB,OAAAuO,OAEA,IAAA8kB,GAAArzB,OAAAO,KAOA,IAAAkzB,GAAAzzB,OAAAO,MAAAqG,KAAA,KACA,KAAA6sB,GAAA,MAAAA,EAAA,CAGA,GAAA,OAAAvgB,EAAA,CACA,GAAA0f,GAAAS,EAAAxG,WAAA,cACA,IAAA+F,EACA,GAAAV,GAAAU,EAAAc,OAEA,IAAAxB,GAAA,CAEAmB,GAAApC,QAAA,eAAAxuB,KAAA,YAAAoqB,WAAA,iBAEA,IAAAqF,GAAAmB,EAAA3G,OAKA,IAHAjsB,EAAAC,QAAA,aAAAkB,QAAA,YAAAswB,GAGA,OAAAhf,EACA,GAAAygB,GAAAN,EAAAxG,WAAA,QAAAuF,MAAA,GAAAzD,QAAA,iCAEA,IAAAgF,GAAAN,EAAAzjB,MAAAwiB,MAAA,GAAAzD,QAAA,4BASA,IALAgF,EAAAhpB,EAAAskB,OAAA0E,EAAA,SAAAC,GACA,OAAA,GAAAA,EAAAl3B,QAAA,OAIA,IAAAi3B,EAAA13B,OAAA,CAEAwE,EAAAC,QAAA,aAAAkB,QAAA,UAAA+xB,EAAA,IAEA3zB,OAAA,mBAAAuH,IAAA,UAAA,SACA9G,EAAAC,QAAA,UAAAkB,QAAA,iBACAyxB,EAAA1mB,SAAA,kBAEA,IAAAglB,GAAA3xB,OAAA,mBAAA0xB,aACA1xB,QAAA,cAAAuH,IAAA,iBAAAoqB,EAAA,KAGA,IAAA4B,GAAAF,EAAAvK,KAAA,eACAuK,GAAAvK,KAAA,eAAA,OACAuK,EAAAzsB,KAAA,eAAA2sB,EAEA,IAAAC,GAAAH,EAAApC,QAAA,6BACA,IAAAuC,EAAA/wB,KAAA,gBAAAxG,OACAu3B,EAAA/wB,KAAA,gBAAAkK,SAAA,2BAEA6mB,EAAA7mB,SAAA,2BAGA6mB,EAAA/sB,IAAA,SACA+sB,EAAA3yB,GAAA,QAAA,SAAAgvB,IAEA,KADA7vB,OAAA6vB,EAAAthB,QAAAua,KAAA,cACApsB,QAAA,6BACA+D,EAAAC,QAAA,aAAAkB,QAAA,aAAA,IACA5B,OAAA,mBAAAuH,IAAA,UAAA,QACA9G,EAAAC,QAAA,UAAAkB,QAAA,gBACA5B,OAAA,mBAAAiO,cACAjO,OAAA,oBAAAiO,YAAA,mBACAjO,OAAA,4BAAAiO,YAAA,6BAIA,IAAAzQ,GAAAm2B,EAAA,GAAAt3B,QAAA,IAAA,GACAoE,GAAAC,QAAA,cAAAkB,QAAA,eAAApE,OAEAwC,QAAA,mBAAAuH,IAAA,UAAA,QACA9G,EAAAC,QAAA,UAAAkB,QAAA,gBACA5B,OAAA,mBAAAiO,cACAjO,OAAA,oBAAAiO,YAAA,mBACAjO,OAAA,4BAAAiO,YAAA,iCC5gBA3T,EAAA,qCAAA,WAeA,MAdA2F,YAAA5B,OAAA8B,QACAG,WAAA,WAEAC,KAAAC,SAAAC,EAAAC,QAAA,OAAA,uBAAAH,KAAAowB,sBAGAA,oBAAA,SAAAvmB,EAAAgC,GACAhC,EAAAvI,IAAA,aCVAvH,EAAA,oCAAA,WAkBA,MAjBA2F,YAAA5B,OAAA8B,QACAG,WAAA,WACAC,KAAAC,SAAAC,EAAAC,QAAA,OAAA,uBAAAH,KAAAszB,iBAGAA,eAAA,WACA,GAAA7xB,GAAAvB,EAAAC,QAAA,OAAAkB,QAAA,gBAEA,IAAAI,EAAAH,IAAA,YAAAA,IAAA,eACApB,EAAAC,QAAA,UAAAkB,QAAA,OAAAsR,KAAA,SAAA4B,MAAA,SAAA4K,MAAA,OAEA1d,EAAAyH,IAAA,wBAAA,GACAhJ,EAAAC,QAAA,OAAAkB,QAAA,YAAA,gBCbAtH,EAAA,yBAAA,WAsTA,MArTA2F,YAAA5B,OAAA8B,QACAG,WAAA,WAEAG,EAAAC,QAAA,oBAAAgF,MAAA,iBAAA,WAAA,OAAA,IAEAnF,KAAAC,SAAAC,EAAAC,QAAA,OAAA,oBAAAH,KAAAuzB,kBAGAvzB,KAAAC,SAAAC,EAAAC,QAAA,oBAAA,iBAAAH,KAAAyY,eAGAzY,KAAAC,SAAAC,EAAAC,QAAA,oBAAA,kBAAAH,KAAAwzB,gBAGAxzB,KAAAC,SAAAC,EAAAC,QAAA,oBAAA,cAAAH,KAAAgM,YAGAhM,KAAAyzB,iBAEAh0B,OAAA6sB,WAAAtf,QAAA0mB,OACAC,MAAA,uCACAC,YAAA,yCACAC,aAAA,qCACAC,UAAA,uCACAC,WAAA,wCACAC,OAAA,oCACAC,QAAA,qCAEAC,KAAA,kCACA/H,MAAA,iCAEAgI,MAAA,8BACAC,KAAA,kCACAC,OAAA,8CAGAC,OAAA,oCACAC,KAAA,kCACAC,OAAA,oCACAC,MAAA,uCAEAC,MAAA,4BACAC,YAAA,gCAIAC,KAAA,2BACAC,OAAA,sBAIAC,MAAA,mCAGAC,UAAA,uCACAC,KAAA,2BACAC,cAAA,iCAIAj1B,KAAAk1B,mBAGA3B,iBAAA,SAAA1pB,GACAA,EAAAX,IAAA,mBAAA,IAGAisB,QAAA,SAAAtrB,EAAAgC,EAAAK,GAIA,GAAA9J,GAAApC,KAEAo1B,EAAA,SAAA9vB,GACA,MAAAlD,GAAAgzB,WAAA9vB,IAEA+vB,EAAA,SAAA/vB,GACA,MAAAlD,GAAAizB,YAAA/vB,IAEA6F,EAAAnL,KAAAmL,YAEAmqB,IACA,kBAAA,WACA,aAAA,OAAA,SAAA,YAAA,WACA,SAAA,KAAA,QACA,aAAA,eACA,eAAA,aAAA,YACA,SAAA,WACA,WAAA,OAAA,UACA,SAAA,cAAA,YAAA,aAGA71B,QAAAyM,EAAAjK,IAAAC,KAAA,eAAAoqB,YACAgJ,QAAAA,EACA5xB,SACA0xB,WAAAA,EACAjqB,UAAAA,EACAkqB,YAAAA,GAEAzuB,OAAA,IACA2uB,YACAhe,MAAA,UACAie,aAAA,EACAC,WACAC,OAAA,SAAAC,GACA,GAAA14B,GAAA04B,EAAAC,UACAxzB,GAAAyzB,gBAAAhsB,EAAAgC,EAAA5O,MAIA64B,cAAA,EACAL,WACAC,OAAA,SAAAl3B,EAAA8G,GACA,GAAArI,GAAAwC,OAAAO,MAAAssB,WAAA,OACAlqB,GAAAyzB,gBAAAhsB,EAAAgC,EAAA5O,GACAiD,EAAAC,QAAA,cAAAY,QAAA,OAAA8I,EAAAgC,EAAA5O,IAEA84B,QAAA,SAAAv3B,EAAA8G,GACApF,EAAAC,QAAA,cAAAY,QAAA,QAAAvC,EAAAwB,KAAAsF,IAEA0wB,UAAA,SAAAx3B,EAAA8G,GACApF,EAAAC,QAAA,cAAAY,QAAA,UAAAvC,EAAAwB,KAAAsF,IAEA2wB,QAAA,SAAAz3B,EAAA8G,GACApF,EAAAC,QAAA,cAAAY,QAAA,QAAAvC,EAAAwB,KAAAsF,QAMAuwB,gBAAA,SAAAhsB,EAAAgC,EAAA5O,GACA,GAAA1C,GAAAsP,EAAAvI,IAAA,QACA0nB,EAAAnd,EAAAvK,IAAA/G,GACAovB,EAAA1sB,EAEA+oB,GACAuC,KAAAhuB,EACAyuB,OAAAA,EACAW,MAAAA,GAGApV,GACAqV,OAAA/d,EAAAvK,IAAA,cACAiT,MAAA1I,EAAAvK,IAAA,SACA8kB,OAAA,WAAAvc,EAAAvI,IAAA,SAAA,SAAA0nB,EAAA,OAAAW,EAGAzpB,GAAAC,QAAA,WAAAkB,QAAA,kBAAA,gBAAAwK,EAAAma,EAAAzR,GAEA1I,EAAA3C,IAAAW,EAAAvI,IAAA,QAAAqoB,IAGAlR,cAAA,SAAA5O,EAAAgC,EAAAK,GACAlM,KAAAm1B,QAAAtrB,EAAAgC,EAAAK,EACA,IAAAgqB,GAAAz2B,OAAAyM,EAAAjK,IAAAC,KAAA,gBAAAkV,KAAA,kBAAAlV,KAAA,SACAg0B,GAAAC,YAAA,WACA,MAAA12B,QAAA,UACA22B,MAAA32B,OAAAy2B,GAAA3N,KAAA,SACA9V,KAAAzS,KAAAoyB,eAKAoB,eAAA,SAAA3pB,EAAAgC,EAAAK,GACAlM,KAAAq2B,UAAAxsB,EAAAgC,EAAAK,IAGAmqB,UAAA,SAAAxsB,EAAAgC,EAAAK,GACAzM,OAAAyM,EAAAjK,IAAAC,KAAA,eAAAoqB,WAAA,YAGAzV,aAAA,SAAAhN,EAAAgC,EAAAK,GACAlM,KAAAm1B,QAAAtrB,EAAAgC,EAAAK,IAGAkpB,WAAA,SAAA9vB,GACA,GAAAlD,GAAApC,KACA0Q,EAAAjR,OAAA6sB,WAAA5b,GACA0kB,EAAAl1B,EAAAC,QAAA,OAAAkB,QAAA,eAAA,4BACAi1B,EAAAp2B,EAAAC,QAAA,OAAAkB,QAAA,eAAA,6BACA,OAAAqP,GAAA6lB,aACA7lB,EAAAsL,QACApX,UAAA,8BACA4xB,SAAApB,MACAqB,QAAA,cACAtY,MAAA,SAAA3f,GACA4D,EAAAs0B,gBAAAl4B,EAAA8G,IAEAe,MACAswB,OAAA,cAGAjmB,EAAAkmB,UACAlmB,EAAA6lB,aACA91B,UACAiQ,EAAAsL,QACAwa,SAAAF,MACAG,QAAA,YAKAr2B,UAGA+K,UAAA,SAAA7F,GACA,GAAAoL,GAAAjR,OAAA6sB,WAAA5b,GACAmmB,EAAA32B,EAAAC,QAAA,OAAAkB,QAAA,eAAA,iCACA,OAAAqP,GAAAsL,QACApX,UAAA,6BACA4xB,SAAAK,MACAJ,QAAA,eACAr2B,UAGAi1B,YAAA,SAAA/vB,GACA,GAAAlD,GAAApC,KACA0Q,EAAAjR,OAAA6sB,WAAA5b,GACA2kB,EAAAn1B,EAAAC,QAAA,OAAAkB,QAAA,eAAA,4BACA,OAAAqP,GAAAsL,QACApX,UAAA,kBACA4xB,SAAAnB,MACAoB,QAAA,eACAtY,MAAA,SAAA3f,GACA4D,EAAA00B,iBAAAt4B,EAAA8G,MAEAlF,UAGA02B,iBAAA,SAAAt4B,EAAA8G,GAMA,GALAA,EAAAyxB,OAAA,sBACAzxB,EAAAyxB,OAAA,oBACA/2B,KAAAk1B,eAAA5vB,EAGAtF,KAAAyzB,iBAEA,WADAzzB,MAAAyzB,iBAAApe,MAKArV,MAAAyzB,iBAAAuD,GAAAC,MAAAC,OAAAzD,iBAAAuD,GAAAC,OACAxa,MAAA,gBACAT,QAAA5D,KAAA,WAGA,IAAAhW,GAAApC,IAGAA,MAAAyzB,iBAAAnzB,GAAA,SAAA,WAGA,GAAA62B,GAAA/0B,EAAAqxB,iBAAA2D,QAAA91B,IAAA,aAAA4gB,QAAAmV,QACAj1B,GAAAk1B,YAAAH,EAAA7xB,KAIAtF,KAAAyzB,iBAAApe,QAGAqhB,gBAAA,SAAAl4B,EAAA8G,GACA,GAAA+sB,GAAA/sB,EAAAyxB,OAAA,qBACAzxB,GAAAyxB,OAAA,mBACA,IAAA3e,GAAAia,EAAA7K,UACAxnB,MAAAk1B,eAAA5vB,EAEA7F,OAAAjB,EAAAwP,QAAA0iB,QAAA,uCAAApwB,GAAA,mBAAA,SAAA9B,GACA,OAAA,IAGAiB,OAAAjB,EAAAwP,QAAA0iB,QAAA,uCAAApwB,GAAA,oBAAA,SAAA9B,GACAiB,OAAAjB,EAAAwP,QAAAlI,SAAAA,SAAA5D,KAAA,cAAAmN,IAAA+I,GACA3Y,OAAAjB,EAAAwP,QAAAlI,SAAAA,SAAA5D,KAAA,aAAAoM,WAIAtC,WAAA,SAAAxN,EAAAqL,EAAAgC,EAAAK,GACA,GAAAqrB,GAAA93B,OAAAjB,EAAAwP,QAAAlI,SAAA5D,KAAA,cACAs1B,EAAA/3B,OAAAjB,EAAAwP,QAAAlI,SAAA5D,KAAA,aACAu1B,EAAAh4B,OAAAjB,EAAAwP,QAAAlI,SAAA5D,KAAA,mBAEA,IADAlC,KAAAk1B,eAAA6B,OAAA,uBACAt3B,OAAAjB,EAAAwP,QAAAyjB,SAAA,eAAA,CACA,GAAArZ,GAAAmf,EAAAloB,MACA7N,EAAAg2B,EAAAnoB,MACAqoB,IAAAD,EAAAt9B,KAAA,UACA,IAAAie,EAAA1c,QAAA,GAAA8F,EAAA9F,QACAsE,KAAAk1B,eAAA6B,OAAA,qBAAA3e,KAAAA,EAAA5W,IAAAA,EAAAk2B,YAAAA,IAGAH,EAAAloB,IAAA,IACAmoB,EAAAnoB,IAAA,IACAooB,EAAAt9B,KAAA,WAAA,GACAsF,OAAAjB,EAAAwP,QAAA0iB,QAAA,2BAAAhjB,YAAA,SAGA4pB,YAAA,SAAAL,EAAA3xB,GACAtF,KAAAk1B,eAAA6B,OAAA,uBACA,SAAAE,EAAAtkB,KACA3S,KAAAk1B,eAAA6B,OAAA,qBAAAE,EAAAz1B,KAEAxB,KAAAk1B,eAAA6B,OAAA,qBACA3e,KAAA6e,EAAAxa,OAAAwa,EAAAU,SACAn2B,IAAAy1B,EAAAz1B,WC/SAzH,EAAA,wCAAA,WAgJA,MA/IA2F,YAAA5B,OAAA8B,QAEAG,WAAA,WAGAC,KAAAC,SAAAC,EAAAC,QAAA,gBAAA,oBAAAH,KAAA43B,iBAGA53B,KAAAC,SAAAC,EAAAC,QAAA,6BAAA,uBAAAH,KAAA63B,cAGA73B,KAAAC,SAAAC,EAAAC,QAAA,gBAAA,oBAAA,WACAH,KAAAC,SAAAC,EAAAC,QAAA,OAAA,iBAAAH,KAAA83B,6BAGA93B,KAAAC,SAAAC,EAAAC,QAAA,OAAA,uBAAAH,KAAA+3B,gBAEA/3B,KAAAC,SAAAC,EAAAC,QAAA,UAAA,SAAAH,KAAAg4B,sBACAh4B,KAAAC,SAAAC,EAAAC,QAAA,UAAA,SAAAH,KAAAi4B,uBAGAL,gBAAA,SAAA/tB,GACAA,EAAA5J,SAAAC,EAAAC,QAAA,OAAA,kBAAA0J,EAAAigB,WAGA9pB,KAAAC,SAAAC,EAAAC,QAAA,OAAA,mBAAAH,KAAAk4B,iBAGAA,eAAA,SAAArsB,EAAA2T,EAAA3V,GAEA,GAAAikB,GAAAtO,EAAAuO,oBAAA,IACAF,EAAArO,EAAAle,IAAA,MAEA,iBAAAuI,EAAAvI,IAAA,SAAAuK,EAAAvK,IAAAuI,EAAAvI,IAAA,UAAAwsB,GAEAjiB,EAAA3C,IAAAW,EAAAvI,IAAA,QAAAusB,IAIAgK,aAAA,SAAAhuB,EAAAgC,GAEA,GAAA5C,GAAA/I,EAAAC,QAAA,UAAAkB,QAAA,kBAEAqR,EAAA7I,EAAAvI,IAAA,eAEA0L,IAEAuH,MAAA,KACAtX,MAAA,GAGAmN,GAAAC,KAAApB,EAAAuB,OAAA,SAAA2Z,GAEA,GAAAtY,EAAA8Z,KAAAxB,EAAAwB,UAEA,KAAAjT,GAAA,GAAAA,EAAAhX,QAAA0O,EAAA+tB,SAAAzlB,EAAAyR,EAAA7iB,IAAA,UAAA,CAEA,GAAA82B,GAAAvuB,EAAAvI,IAAA,eACA,IAAA82B,OAAA,KAAAA,EAAAjU,EAAA7iB,IAAA,SAAA,CACA,GAAA+2B,IAAA,CAKA,IAJAjuB,EAAAC,KAAA+tB,EAAAjU,EAAA7iB,IAAA,SAAA,SAAArE,EAAA8Z,GACAuB,QAAAC,IAAAtb,EAAA,IAAAknB,EAAA7iB,IAAAyV,IACA9Z,GAAAknB,EAAA7iB,IAAAyV,KAAAshB,GAAA,KAEAA,EAAA,OAGA,GAAAp7B,GAAAknB,EAAA7iB,IAAA,MACA,QAAAuI,EAAAvI,IAAA,uBACA,IAAA,MACArE,EAAAknB,EAAA7iB,IAAA,MACA,MACA,KAAA,YACA,QACArE,EAAA,UAAAknB,EAAA7iB,IAAA,OAAA,IAGA0L,EAAArQ,MACA4X,MAAA4P,EAAA7iB,IAAA,SACArE,MAAAA,WAIA,KAAAyV,GAAA,GAAAA,EAAAhX,QACA0O,EAAAC,KAAAqI,EAAA,SAAA0M,GAEA,GAAAkZ,GAAAp4B,EAAAC,QAAA,UAAAkB,QAAA,WAAA+d,EAEApS,GAAArQ,MACA4X,MAAA,UAAA+jB,EAAAh3B,IAAA,YAAA,SACArE,MAAA,YAAAmiB,MAKAvV,EAAAX,IAAA,UAAA8D,IAGA8qB,0BAAA,SAAAt5B,EAAA6B,EAAAwL,GAEA,GAAA,gBAAAxL,EAAAiB,IAAA,QAAA,CAEA,GAAA/G,GAAA8F,EAAAiB,IAAA,QACArE,EAAA4O,EAAAvK,IAAA/G,EAEA,IAAA0C,EAAA,CAEA,GAAAs7B,GAAAt7B,EAAA5B,MAAA,IAEA,aAAAk9B,EAAA,KAEAv4B,KAAAyL,WAAA,WACAzL,KAAAw4B,aAAAD,EAAA,GAEA1sB,EAAA3C,IAAA3O,EAAA,IAEAyF,KAAAy4B,cAAA,EACAv4B,EAAAC,QAAA,OAAAkB,QAAA,oBAGA42B,qBAAA,WACA,GAAAj4B,KAAAy4B,aAAA,CACA,GAAAC,GAAAx4B,EAAAC,QAAA,OAAAkB,QAAA,kBAAA,SACAnB,GAAAC,QAAA,OAAAkB,QAAA,uBAAA,KAAAq3B,GACA14B,KAAAy4B,aAAA,OAIAV,eAAA,WACA/3B,KAAAyL,aACAvL,EAAAC,QAAA,OAAAkB,QAAA,cAAArB,KAAAyL,YACAzL,KAAAyL,WAAA,OAIAusB,qBAAA,WACAh4B,KAAAw4B,eACAt4B,EAAAC,QAAA,mBAAAY,QAAA,gBAAAf,KAAAw4B,cACAx4B,KAAAw4B,aAAA,WCtIAz+B,EAAA,oCAAA,uCAAA,gCAAA,SAAAgwB,EAAAC,GACA,MAAAtqB,YAAA5B,OAAA8B,QAKA+4B,qBAEA54B,WAAA,WACAC,KAAAC,SAAAC,EAAAC,QAAA,cAAA,oBAAAH,KAAA44B,2BACA54B,KAAAC,SAAAC,EAAAC,QAAA,UAAA,iBAAAH,KAAA64B,4BACA34B,EAAAC,QAAA,cAAAgF,MAAA,uBAAAnF,KAAA0pB,oBAAA1pB,OAQA44B,0BAAA,SAAA/uB,GACA7J,KAAA24B,kBAAAh8B,KAAAkN,EAAAvI,IAAA,UASAu3B,2BAAA,SAAApZ,GAGA,OAAA,KAAAA,EAAAqZ,QAAArqB,IAAA,CAEA,GAAAqf,GAAArO,EAAAsO,oBAAAtf,IACAof,EAAApO,EAAAqZ,QAAArqB,IAOArM,EAAApC,IACAoK,GAAAC,KAAAlB,SAAAwnB,MAAAxwB,QAAA,WAAAkB,QAAA,kBAAAmJ,OAAA,SAAAuuB,GACA3uB,EAAAC,KAAA0uB,EAAAxP,WAAA,SAAAtsB,EAAA8Z,GACA,GAAAiiB,GAAA,EACA5uB,GAAAC,KAAAjI,EAAAu2B,kBAAA,SAAAl7B,GACA,GAAAsZ,GAAAtZ,EAAA,IAAAqwB,GAAAkL,GAAAlL,EAAA,CACA,GAAAmL,GAAAF,EAAAz3B,IAAA7D,EAAA,IAAAqwB,EACAiL,GAAA7vB,IAAAzL,EAAA,IAAAowB,EAAAoL,GACAF,EAAA7vB,IAAAzL,EAAA,IAAAqwB,EAAA,GACAkL,EAAAlL,WAYApE,oBAAA,SAAA7f,GAOA,GAAAqa,GAAA9Z,EAAAskB,OAAAxuB,EAAAC,QAAA,UAAAkB,QAAA,kBAAAmJ,OAAA,SAAA2Z,GACA,MAAA/Z,GAAA+tB,SAAAtuB,EAAAvI,IAAA,eAAA6iB,EAAA7iB,IAAA,WAIA6S,EAAA/J,EAAA9O,IAAA4oB,EAAA,SAAAC,GACA,OACA5pB,KAAAsP,EAAAvI,IAAA,QAAA,IAAA6iB,EAAA7iB,IAAA,OACAqR,KAAA,SACA4B,MAAA4P,EAAA7iB,IAAA,SACAiN,MAAA,SAOA,OAHA1E,GAAAX,IAAA,WAAA,GAAA8gB,GAAA7V,IAGA4V,OC1FAhwB,EAAA,iCAAA,WAuBA,MAtBA2F,YAAA5B,OAAA8B,QACAG,WAAA,WAGAC,KAAAC,SAAAC,EAAAC,QAAA,qBAAA,uBAAAH,KAAAk5B,OAGAA,KAAA,SAAArvB,EAAAgC,GAEA,aAAAhC,EAAAvI,IAAA,WAGAuK,EAAAvL,GAAA,UAAAuJ,EAAAvI,IAAA,UAAAtB,KAAA6Q,OAAAhH,IAGAgH,OAAA,SAAAhF,EAAAstB,GAGAttB,EAAA3C,IAAAlJ,KAAAsB,IAAA,QAAA63B,QCrBAp/B,EAAA,kCAAA,WAiCA,MAhCA2F,YAAA5B,OAAA8B,QACAG,WAAA,WAEAG,EAAAC,QAAA,sBAAAgF,MAAA,iBAAAnF,KAAAo5B,gBAEAp5B,KAAAC,SAAAC,EAAAC,QAAA,sBAAA,kBAAAH,KAAAq5B,mBAGAr5B,KAAAC,SAAAC,EAAAC,QAAA,sBAAA,iBAAAH,KAAAs5B,kBAGAA,gBAAA,SAAAzvB,EAAAgC,EAAA6O,GAEA,GACAzY,IADA4H,EAAAvI,IAAA,QACA7B,OAAAib,EAAAzY,IAAAC,KAAA,SAEAzC,QAAAwC,GAAAs3B,eACAnT,OAAA,SAAAkJ,EAAA5e,GACAxQ,EAAAC,QAAA,OAAAkB,QAAA,iBAAAiuB,EAAAzlB,EAAAgC,EAAA6E,EAAA8oB,MAAAhS,gBAKA4R,eAAA,WACA,OAAA,GAGAC,kBAAA,SAAAxvB,EAAAgC,EAAA6O,GACAjb,OAAAib,EAAAzY,IAAAC,KAAA,oBAAAq3B,cAAA,cC1BAx/B,EAAA,gCAAA,WA4CA,MA3CA2F,YAAA5B,OAAA8B,QAEA65B,aAAA,GAEA15B,WAAA,WACAC,KAAAy5B,aAAAhtB,QAAAgtB,cAAA,YACAz5B,KAAAC,SAAAC,EAAAC,QAAA,OAAA,iBAAAH,KAAA05B,YACA15B,KAAAC,SAAAC,EAAAC,QAAA,OAAA,oBAAAH,KAAA25B,cAGAD,WAAA,WACA,GAAAjV,GAAAvkB,EAAAC,QAAA,OAAAkB,QAAA,gBAEArB,MAAA45B,UAAAnV,EAAA/lB,IACAsB,KAAA65B,kBAEA75B,KAAA85B,kBAIAF,UAAA,SAAAG,GACA,MAAAC,OAAAD,IAGAF,gBAAA,WACAp6B,OAAA,kBAAAiO,YAAA,WACAjO,OAAA,oDAAAqG,SAAAsG,SAAA,YAGA0tB,eAAA,WACA,GAAArnB,GAAA,mCAAAzS,KAAAy5B,aAAA,WACA,IAAAh6B,OAAA,kBAAAO,KAAAy5B,aAAA,MAAA/9B,SACA+D,OAAA,kBAAAiO,YAAA,WACAjO,OAAA,oDAAAqG,SAAA6jB,MAAAlX,KAIAknB,YAAA,SAAA9sB,GACA,GAAA,YAAAA,EAAAN,OAAA,OAAA,CACAvM,MAAA05B,kBC3CA3/B,EAAA,4BAAA,WAcA,MAbA2F,YAAA5B,OAAA8B,QACAG,WAAA,WAEAC,KAAAC,SAAAC,EAAAC,QAAA,OAAA,aAAAH,KAAAi6B,kBAGAA,gBAAA,WACA,GAAA/2B,GAAAhD,EAAAC,QAAA,OAAAkB,QAAA,gBACA5B,QAAAyD,GAAAwK,YAAA,uBCTA3T,EAAA,6BAAA,WAwEA,MAvEA2F,YAAA5B,OAAA8B,QACAG,WAAA,WACAG,EAAAC,QAAA,WAAAgF,MAAA,MAAAnF,KAAAk6B,UAAAl6B,MACAE,EAAAC,QAAA,WAAAgF,MAAA,QAAAnF,KAAAm6B,YAAAn6B,MACAA,KAAAo6B,YAGAF,UAAA,SAAAzrB,EAAAwZ,EAAAjb,GAEA,GAAAqtB,IACAtyB,QAAAkgB,EACAuR,MAAA,QACAjoB,OAAA,KACA+oB,iBAAA,EACAC,OAAA,EACAC,WACAnlB,KAAA,OACA8e,MAAA,SAIAsG,GACAxzB,UACAyV,EAAA,SACAC,EAAA,OAEA6d,WACAnlB,KAAA,YACA8e,MAAA,cAEA3P,UAAA,IACA9d,QACAgW,EAAA,EACAC,EAAA,KAIA+d,GACAnR,YACA7M,EAAA,OACAC,EAAA,UAEA6H,UAAA,IAGA,IAAAtkB,EAAAC,QAAA,OAAAkB,QAAA,aACA,GAAAgI,GAAAoxB,MAEA,IAAApxB,GAAAqxB,CAEArxB,GAAA5J,OAAAG,OAAAyJ,EAAAgxB,EAEA,IAAArtB,GAAAvN,OAAAG,OAAAyJ,EAAA2D,EAEAhN,MAAAo6B,QAAA3rB,GAAA,GAAA4I,MAAA,SAAArK,IAGAmtB,YAAA,SAAA1rB,OACA,KAAAzO,KAAAo6B,QAAA3rB,IACAzO,KAAAo6B,QAAA3rB,GAAA0lB,SAIAwG,WAAA,SAAAlsB,OACA,KAAAzO,KAAAo6B,QAAA3rB,IACAzO,KAAAo6B,QAAA3rB,GAAA4G,YClEAtb,EAAA,iCAAA,WAeA,MAdA2F,YAAA5B,OAAA8B,QACAG,WAAA,WACAN,OAAA4F,QAAAirB,KAAA,eAAAtwB,KAAA46B,cAGAA,YAAA,SAAAv6B,GAEA,IAAAH,EAAAC,QAAA,OAAAkB,QAAA,cAAA,SACA,MAAA,iCCPAtH,EAAA,wCAAA,WA4EA,MA3EA2F,YAAA5B,OAAA8B,QACAG,WAAA,WAIAC,KAAA66B,eACA76B,KAAA86B,eACA96B,KAAA+6B,eAMA76B,EAAAC,QAAA,eAAAgF,MAAA,iBAAAnF,KAAAg7B,cAAAh7B,MACAE,EAAAC,QAAA,eAAAgF,MAAA,iBAAAnF,KAAAi7B,cAAAj7B,MACAE,EAAAC,QAAA,eAAAgF,MAAA,iBAAAnF,KAAAk7B,cAAAl7B,MAKAE,EAAAC,QAAA,eAAAgF,MAAA,kBAAAnF,KAAAm7B,eAAAn7B,MACAE,EAAAC,QAAA,eAAAgF,MAAA,kBAAAnF,KAAAo7B,eAAAp7B,MACAE,EAAAC,QAAA,eAAAgF,MAAA,kBAAAnF,KAAAq7B,eAAAr7B,MAWAE,EAAAC,QAAA,iBAAAgF,MAAA,iBAAAnF,KAAAg7B,cAAAh7B,MACAE,EAAAC,QAAA,iBAAAgF,MAAA,iBAAAnF,KAAAi7B,cAAAj7B,MACAE,EAAAC,QAAA,iBAAAgF,MAAA,iBAAAnF,KAAAk7B,cAAAl7B,MAKAE,EAAAC,QAAA,iBAAAgF,MAAA,kBAAAnF,KAAAm7B,eAAAn7B,MACAE,EAAAC,QAAA,iBAAAgF,MAAA,kBAAAnF,KAAAo7B,eAAAp7B,MACAE,EAAAC,QAAA,iBAAAgF,MAAA,kBAAAnF,KAAAq7B,eAAAr7B,OAOAg7B,cAAA,SAAAn8B,EAAAy8B,GACAt7B,KAAA66B,YAAAS,GAAAz8B,GAGAs8B,eAAA,WACA,MAAAn7B,MAAA66B,aAGAI,cAAA,SAAAp8B,EAAAy8B,GACAt7B,KAAA86B,YAAAQ,GAAAz8B,GAGAu8B,eAAA,WACA,MAAAp7B,MAAA86B,aAGAI,cAAA,SAAAr8B,EAAAy8B,GACAt7B,KAAA+6B,YAAAO,GAAAz8B,GAGAw8B,eAAA,WACA,MAAAr7B,MAAA+6B,iBCzEAhhC,EAAA,8CAAA,WAuCA,MAtCA2F,YAAA5B,OAAA8B,QACAG,WAAA,WAIAC,KAAAu7B,eACAv7B,KAAAw7B,gBAIAt7B,EAAAC,QAAA,sBAAAgF,MAAA,iBAAAnF,KAAAy7B,cAAAz7B,MACAE,EAAAC,QAAA,sBAAAgF,MAAA,kBAAAnF,KAAA07B,eAAA17B,MAKAE,EAAAC,QAAA,sBAAAgF,MAAA,kBAAAnF,KAAA27B,eAAA37B,MACAE,EAAAC,QAAA,sBAAAgF,MAAA,mBAAAnF,KAAA47B,gBAAA57B,OAGAy7B,cAAA,SAAA58B,EAAAy8B,GACAt7B,KAAAu7B,YAAAD,GAAAz8B,GAGA68B,eAAA,SAAA78B,EAAAy8B,GACAt7B,KAAAw7B,aAAAF,GAAAz8B,GAGA88B,eAAA,WACA,MAAA37B,MAAAu7B,aAGAK,gBAAA,WACA,MAAA57B,MAAAw7B,kBClCAzhC,EAAA,yCAAA,WAkBA,MAjBA2F,YAAA5B,OAAA8B,QACAG,WAAA,WACAG,EAAAC,QAAA,OAAAgF,MAAA,uBAAAnF,KAAA67B,oBAAA77B,OAGA67B,oBAAA,SAAA/3B,GACA,GAAA0G,KAOA,OALAJ,GAAAC,KAAAvG,EAAA0G,OAAA,SAAAnK,GACA,GAAAopB,GAAAvpB,EAAAC,QAAA,OAAAkB,QAAA,kBAAAhB,EACAmK,GAAA7N,KAAA8sB,KAGA,GAAA3lB,GAAAg4B,YAAAtxB,EAAA1G,EAAAkJ,cCZAjT,EAAA,kCAAA,WA6CA,MA5CA2F,YAAA5B,OAAA8B,QACA4O,QAEAzO,WAAA,WACA,GAAAqC,GAAApC,IAKAP,QAAAsoB,UAAAznB,GAAA,UAAA,SAAA9B,GACA4D,EAAA25B,QAAAv9B,EAAA4D,KAGA3C,OAAAsoB,UAAAznB,GAAA,QAAA,SAAA9B,GACA4D,EAAA45B,MAAAx9B,EAAA4D,KAMAlC,EAAAC,QAAA,OAAAgF,MAAA,cAAAnF,KAAAi8B,WAAAj8B,OAGA+7B,QAAA,SAAAv9B,EAAA8G,GAIAA,EAAAkJ,KAAAhQ,EAAA0Q,SAAA1Q,EAAA0Q,SAGA8sB,MAAA,SAAAx9B,EAAA8G,IAIA,GAAAA,EAAAkJ,KAAArS,QAAAqC,EAAA0Q,gBACA5J,GAAAkJ,KAAAhQ,EAAA0Q,UAIA+sB,WAAA,WACA,MAAAj8B,MAAAwO,UC3CAzU,EAAA,mCAAA,WA0CA,MAzCA2F,YAAA5B,OAAA8B,QACAs8B,UAAA,EAEAn8B,WAAA,WAIAC,KAAAC,SAAAC,EAAAC,QAAA,QAAA,YAAAH,KAAAm8B,mBAKAn8B,KAAAC,SAAAC,EAAAC,QAAA,UAAA,SAAAH,KAAAo8B,UACAp8B,KAAAC,SAAAC,EAAAC,QAAA,UAAA,qBAAAH,KAAAq8B,YAGAF,kBAAA,SAAAzhB,GACAxa,EAAAC,QAAA,OAAAkB,QAAA,cACA5B,OAAAib,EAAAzY,IAAA6D,SAAAsC,kBACAk0B,iBAAA,IAIA78B,OAAA,QAAAkI,OAAA,0DAGAy0B,SAAA,WACA,GAAAxuB,GAAA1N,EAAAC,QAAA,OAAAkB,QAAA,gBACA66B,EAAAz8B,OAAAmO,GAAA2uB,YAEA98B,QAAA,qBAAA2Y,KAAA,gCAAA8jB,EAAA,qBACAz8B,OAAA,iCAAA2M,SAAA,wBAIAiwB,UAAA,WACA58B,OAAA,wBAAAiO,YAAA,4BCrCA3T,EAAA,gCAAA,gCAAA,SAAAyiC,GAaA,MAZArzB,UAAAC,MAAAxJ,QACAyJ,UACAoL,SAAA,GAGA1U,WAAA,SAAAiN,GACA,GAAAhN,KAAAsB,IAAA,qBAAA6H,UAAAK,YACAxJ,KAAAkJ,IAAA,WAAA,GAAAszB,GAAAx8B,KAAAsB,IAAA,mBCRAvH,EAAA,qCAAA,gCAAA,SAAA0iC,GAIA,MAHAtzB,UAAAK,WAAA5J,QACAS,MAAAo8B,MCDA1iC,EAAA,gDAAA,qCAAA,SAAA2iC,GAmBA,MAlBAh9B,YAAA5B,OAAA8B,QACAG,WAAA,WAEAG,EAAAC,QAAA,OAAAgF,MAAA,uCAAAnF,KAAA28B,6BAAA38B,OASA28B,6BAAA,WACA,MAAAD,QChBA3iC,EAAA,kCAAA,WAsCA,MArCA2F,YAAA5B,OAAA8B,QACAG,WAAA,WAEAC,KAAAC,SAAAC,EAAAC,QAAA,sBAAA,cAAAH,KAAAgM,aAGAA,WAAA,SAAAxN,EAAAqL,EAAAgC,EAAAK,GACA,GAAAqrB,GAAA93B,OAAAjB,EAAAwP,QAAAlI,SAAA5D,KAAA,WAEA,IAAAzC,OAAAjB,EAAAwP,QAAAyjB,SAAA,sBAAA,CAEA,GAAAzxB,KAAAyzB,iBAEA,WADAzzB,MAAAyzB,iBAAApe,MAKArV,MAAAyzB,iBAAAuD,GAAAC,MAAAC,OAAAzD,iBAAAuD,GAAAC,OACAxa,MAAA,gBACAT,QAAA5D,KAAA,WAGA,IAAAhW,GAAApC,IAGAA,MAAAyzB,iBAAAnzB,GAAA,SAAA,WAEA,GAAA62B,GAAA/0B,EAAAqxB,iBAAA2D,QAAA91B,IAAA,aAAA4gB,QAAAmV,QACAE,GAAAloB,IAAA8nB,EAAA31B,KAAA4kB,WAIApmB,KAAAyzB,iBAAApe,aChCAtb,EAAA,wBAAA,qCAAA,SAAA2iC,GAWA,MAVAvzB,UAAAC,MAAAxJ,QACAG,WAAA,YACA,GAAAC,KAAAsB,IAAA,0BAAA6H,UAAAK,YACAxJ,KAAAkJ,IAAA,gBAAA,GAAAwzB,GAAA18B,KAAAsB,IAAA,mBAGApB,EAAAC,QAAA,UAAAY,QAAA,iBAAAf,WCPAjG,EAAA,6BAAA,wBAAA,SAAA0gB,GAWA,MAVAtR,UAAAK,WAAA5J,QACAS,MAAAoa,EACA9H,MAAA,EAEA5S,WAAA,SAAAyK,EAAAwC,GACA5C,EAAAC,KAAA2C,EAAA,SAAA4vB,EAAAnuB,GACAzO,KAAAyO,GAAAmuB,GACA58B,WCRAjG,EAAA,oCAAA,WAOA,MANAoP,UAAAC,MAAAxJ,QACAyJ,UACAjI,QAAA,QCHArH,EAAA,uCAAA,kCAAA,SAAA8iC,GAIA,MAHA1zB,UAAAK,WAAA5J,QACAS,MAAAw8B,MCGA9iC,EAAA,4BACA,4BACA,uCAEA,SACA+iC,EACAC,GA8GA,MA5GAr9B,YAAA5B,OAAA8B,QACAG,WAAA,WAEAC,KAAAwvB,SAAA,GAAAuN,GAAAC,mBACAh9B,KAAAC,SAAAC,EAAAC,QAAA,UAAA,iBAAAH,KAAAi9B,iBAGAj9B,KAAA8D,WAAA,GAAAg5B,GAAAI,eAAAvqB,KAAA,WAGAzS,EAAAC,QAAA,UAAAgF,MAAA,WAAAnF,KAAAm9B,aAAAn9B,MACAE,EAAAC,QAAA,UAAAgF,MAAA,qBAAAnF,KAAAo9B,kBAAAp9B,MACAE,EAAAC,QAAA,UAAAgF,MAAA,mBAAAnF,KAAAq9B,gBAAAr9B,MACAE,EAAAC,QAAA,UAAAgF,MAAA,kBAAAnF,KAAAs9B,eAAAt9B,MAGAA,KAAAC,SAAAC,EAAAC,QAAA,UAAA,kBAAAH,KAAA4f,WAGAqd,gBAAA,SAAAxiB,GACA,UAAAA,EAAA3W,WAAA6O,MAAA8H,EAAAnZ,IAAA,YAEAtB,KAAAwvB,SAAAluB,IAAAmZ,EAAAnZ,IAAA,YAAAA,IAAA,cAAA3E,KAAA8d,EAAAnZ,IAAA,QAUA67B,aAAA,SAAAz+B,GACA,MAAAsB,MAAA8D,WAAAxC,IAAA5C,IAUA0+B,kBAAA,SAAA1+B,GACA,MAAAsB,MAAA8D,YAUA8b,SAAA,SAAAphB,GACA,GAAAmU,GAAAlT,OAAAjB,EAAAwP,QAAA3H,KAAA,KAEA,IAAA7H,EAAA++B,SAEA,WADAr9B,GAAAC,QAAA,UAAAkB,QAAA,kBAAAsR,EAIA,IAAA8M,GAAAvf,EAAAC,QAAA,UAAAkB,QAAA,OACAsR,KAAAA,EAEA4B,MAAArU,EAAAC,QAAA,UAAAkB,QAAA,WAAAsR,GAAArR,IAAA,aAGAgX,SAAAC,IAAAkH,EAEA,IAAAlL,IACAqV,OAAA,QACArV,MAAAkL,EAAAne,IAAA,SACA8kB,OAAA,QACAH,SAAA,YAGA5f,GACAvC,WAAA5D,EAAAC,QAAA,UAAAkB,QAAA,kBAGAnB,GAAAC,QAAA,WAAAkB,QAAA,kBAAA,YAAAoe,EAAA,KAAAlL,EAAAlO;wEAGAnG,EAAAC,QAAA,UAAAkB,QAAA,sBASAg8B,gBAAA,WACA,MAAAr9B,MAAAwvB,UASA8N,eAAA,WACAt9B,KAAAwvB,SAAAluB,IAAA,cCrHAvH,EAAA,sCAAA,WAoDA,MAnDA2F,YAAA5B,OAAA8B,QACAG,WAAA,WAEAC,KAAAC,SAAAC,EAAAC,QAAA,mBAAA,iBAAAH,KAAAw9B,WACAx9B,KAAAC,SAAAC,EAAAC,QAAA,mBAAA,gBAAAH,KAAAy9B,UAKAv9B,EAAAC,QAAA,mBAAAgF,MAAA,sBAAAnF,KAAA09B,+BAAA19B,OAgBAw9B,UAAA,SAAAl4B,EAAAoL,GACA1Q,KAAA4N,SAAA1N,EAAAC,QAAA,OAAAkB,QAAA,gBACArB,KAAAknB,OAAAhnB,EAAAC,QAAA,OAAAkB,QAAA,cACA5B,OAAAO,KAAA4N,UAAA,GAAA+vB,MAAAC,YAAA,WAAA,UAAA,aAEA59B,KAAA69B,qBAAAp+B,OAAAiR,EAAAH,QAAAlF,SAYAoyB,SAAA,SAAAn4B,EAAAoL,GACAjR,OAAAO,KAAA4N,UAAA,GAAA+vB,MAAAC,YAAA,WAAA,SAAA,cAGAF,+BAAA,WACA,MAAA19B,MAAA69B,0BChDA9jC,EAAA,oCAAA,WA8CA,MA7CA2F,YAAA5B,OAAA8B,QACAG,WAAA,WAEAC,KAAAC,SAAAC,EAAAC,QAAA,mBAAA,yBAAAH,KAAAw9B,WACAx9B,KAAAC,SAAAC,EAAAC,QAAA,mBAAA,wBAAAH,KAAAy9B,WAcAD,UAAA,SAAAl4B,EAAAoL,GACA1Q,KAAA4N,SAAA1N,EAAAC,QAAA,OAAAkB,QAAA,gBACArB,KAAAknB,OAAAhnB,EAAAC,QAAA,OAAAkB,QAAA,cACA5B,OAAAO,KAAA4N,UAAA,GAAA+vB,MAAAC,YAAA,WAAA,UAAA,YAGA,IAAAE,GAAA59B,EAAAC,QAAA,UAAAkB,QAAA,eACAoR,EAAAvS,EAAAC,QAAA,OAAAkB,QAAA,eAAA,8BACA5B,QAAAiR,EAAAH,QAAAkC,KAAAA,GAAAsrB,IAAAD,EAAAtzB,OAAA9O,UACA+D,OAAAiR,EAAAH,QAAApW,KAAA,KAAA,yBACAsF,OAAAiR,EAAAkL,MAAA5U,IAAA,UAAA,QAWAy2B,SAAA,SAAAn4B,EAAAoL,GACAjR,OAAAO,KAAA4N,UAAA,GAAA+vB,MAAAC,YAAA,WAAA,SAAA,kBCtCA7jC,EAAA,8BAAA,mCAAA,SAAA8Z,GAwIA,MAvIAnU,YAAA5B,OAAA8B,QACAG,WAAA,WAEAC,KAAA8D,WAAA,GAAA+P,GAEA3T,EAAAC,QAAA,UAAAgF,MAAA,kBAAAnF,KAAAg+B,eAAAh+B,MACAE,EAAAC,QAAA,UAAAgF,MAAA,qBAAAnF,KAAA+P,kBAAA/P,MACAE,EAAAC,QAAA,UAAAgF,MAAA,cAAAnF,KAAAi+B,qBAAAj+B,MACAE,EAAAC,QAAA,UAAAgF,MAAA,eAAAnF,KAAAk+B,iBAAAl+B,MACAE,EAAAC,QAAA,UAAAgF,MAAA,gBAAAnF,KAAAm+B,kBAAAn+B,MAEAA,KAAAC,SAAAC,EAAAC,QAAA,mBAAA,0BAAAH,KAAA+P,mBAEA/P,KAAAC,SAAAC,EAAAC,QAAA,mBAAA,qBAAAH,KAAAo+B,oBAGAH,qBAAA,WACA,MAAAj+B,MAAA8D,YAUAk6B,eAAA,SAAArrB,EAAAsE,GACA,GAAAA,GAAAA,IAAA,EAEAmI,EAAAlf,EAAAC,QAAA,UAAAkB,QAAA,WAAAsR,GAEAyX,EAAA,mBAAA3qB,OAAA4+B,MAEAh4B,GACA3H,GAAA0rB,EAEAzU,KAAAyJ,EAAA9d,IAAA,QAEAsR,SAAAwM,EAAA9d,IAAA,YAEAuR,KAAAuM,EAAA9d,IAAA,SAGAjB,EAAAL,KAAA8D,WAAA4G,IAAArE,EAIA,OAFA4Q,IAAA/W,EAAAC,QAAA,UAAAY,QAAA,kBAAAV,GAEA+pB,GAWAra,kBAAA,SAAAvR,EAAA6B,GACAL,KAAA8D,WAAAwG,OAAAjK,GACAH,EAAAC,QAAA,UAAAY,QAAA,qBAAAV,IASA+9B,kBAAA,WACA,GAAA,GAAAp+B,KAAA8D,WAAA0G,OAAA9O,OAAA,CAEA,GAAAuN,GAAA/I,EAAAC,QAAA,UAAAkB,QAAA,iBAIA+I,GAAAC,KAAArK,KAAA8D,WAAA0G,OAAA,SAAAnK,GAEA,GAAA+pB,GAAAlqB,EAAAC,QAAA,UAAAkB,QAAA,aAEAi9B,GAAA5/B,GAAA0rB,EAAA7V,MAAAlU,EAAAiB,IAAA,YAAAqR,KAAAtS,EAAAiB,IAAA,SAEAmoB,EAAAvpB,EAAAC,QAAA,UAAAkB,QAAA,MAAAi9B,GAAA,GAEA/pB,GACAqV,OAAA,QACArV,MAAAkV,EAAAnoB,IAAA,SACA8kB,OAAA,QACAH,SAAA,YAEA5f,GACAvC,WAAAmF,EAEA/I,GAAAC,QAAA,WAAAkB,QAAA,kBAAA,YAAAooB,EAAA,KAAAlV,EAAAlO,KAIA4C,EAAAlI,QAAA,QAAAkI,GAEAjJ,KAAA8D,WAAAiQ,QAGA7T,EAAAC,QAAA,UAAAkB,QAAA,cAAA,KAAA,MAAA,IASA68B,iBAAA,WAEA,GAAAK,GAAAr+B,EAAAC,QAAA,OAAAkB,QAAA,sBAEA8d,EAAA1f,OAAA8+B,GAAAluB,SAAA,UAEAjG,GAAAC,KAAArK,KAAA8D,WAAA0G,OAAA,SAAA2Z,GAEA,GAAAqa,GAAAra,EAAA7iB,IAAA,MACAm9B,EAAAtf,EAAAhjB,QAAAqiC,EAEAra,GAAAjb,IAAA,QAAAu1B,KAGAz+B,KAAA8D,WAAAqiB,QAGAgY,kBAAA,WACAn+B,KAAA8D,WAAAiQ,aCtIAha,EAAA,sCAAA,mCAAA,SAAA8Z,GA4HA,MA3HAnU,YAAA5B,OAAA8B,QACAG,WAAA,WAKAC,KAAAC,SAAAC,EAAAC,QAAA,mBAAA,uBAAAH,KAAA0+B,qBACA1+B,KAAAC,SAAAC,EAAAC,QAAA,mBAAA,oBAAAH,KAAA2+B,kBACA3+B,KAAAC,SAAAC,EAAAC,QAAA,mBAAA,mBAAAH,KAAA4+B,iBACA5+B,KAAAC,SAAAC,EAAAC,QAAA,mBAAA,qBAAAH,KAAA6+B,mBACA7+B,KAAAC,SAAAC,EAAAC,QAAA,mBAAA,oBAAAH,KAAA8+B,mBAUAJ,oBAAA,SAAAhuB,GACA,GAAAjR,OAAAiR,EAAAkL,MAAA6V,SAAA,2BAAA,CACA,GAAA9e,GAAAlT,OAAAiR,EAAAkL,MAAAvV,KAAA,MACA+jB,EAAAlqB,EAAAC,QAAA,UAAAkB,QAAA,kBAAAsR,EACAlT,QAAAiR,EAAAH,QAAApW,KAAA,KAAAiwB,GACAlqB,EAAAC,QAAA,UAAAkB,QAAA,gBACA5B,OAAAiR,EAAAH,QAAAjG,SACApK,EAAAC,QAAA,mBAAAY,QAAA,iBAAA4R,KASAosB,eAAA,WACA,GAAAC,GAAA9+B,EAAAC,QAAA,OAAAkB,QAAA,qBACA5B,QAAAu/B,GAAA5yB,SAAA,wBASA6yB,kBAAA,WACA,GAAAD,GAAA9+B,EAAAC,QAAA,OAAAkB,QAAA,qBACA5B,QAAAu/B,GAAAtxB,YAAA,wBAWAixB,iBAAA,SAAAngC,EAAAkS,GACA,GAAAjR,OAAAiR,EAAAkL,MAAA6V,SAAA,2BAAA,CACA,GAAA9e,GAAAlT,OAAAiR,EAAAkL,MAAAvV,KAAA,MACA+Y,EAAAlf,EAAAC,QAAA,UAAAkB,QAAA,WAAAsR,GACAC,EAAAwM,EAAA9d,IAAA,WACAtB,MAAAk/B,cAAAxuB,EAAAH,OACA9Q,OAAAiR,EAAAH,QAAAkC,KAAAG,EAAA,qDACAnT,OAAAiR,EAAAH,QAAA7C,YAAA,wBAAAtB,SAAA,gBAAApF,KAAAiK,QAAA,MAAA1C,MAAA,GAAA3H,OAAA,IACA,IAAA23B,GAAAr+B,EAAAC,QAAA,OAAAkB,QAAA,qBACA5B,QAAA8+B,GAAA9M,SAAA,gBACAhyB,OAAA8+B,GAAAnyB,SAAA,wBAaAwyB,gBAAA,SAAAluB,GACA,GAAAjR,OAAAiR,EAAAkL,MAAA6V,SAAA,2BAAA,CACA,GAAA0N,GAAAj/B,EAAAC,QAAA,mBAAAkB,QAAA,sBACA5B,QAAAO,KAAAk/B,eAAAzsB,KAAAhT,OAAA0/B,GAAA1sB,QACAhT,OAAAO,KAAAk/B,eAAAxxB,YAAA,gBAAAtB,SAAA,uBACA,IAAAmyB,GAAAr+B,EAAAC,QAAA,OAAAkB,QAAA,qBACA5B,QAAA8+B,GAAA9M,SAAA,gBACAhyB,OAAA8+B,GAAA7wB,YAAA,wBAaAmxB,kBAAA,SAAAnuB,GACAjR,OAAAiR,EAAAkL,MAAA/X,OACApE,OAAAiR,EAAAkL,MAAA5U,KAAAyN,QAAA,SAAAxD,QAAA,QACAxR,OAAAiR,EAAAH,QAAAvJ,IAAA,UAAA,QAUA83B,iBAAA,SAAApuB,GACAjR,OAAAiR,EAAAkL,MAAA5U,IAAA,UAAA,IACAvH,OAAAiR,EAAAH,QAAAjG,cCvHAvQ,EAAA,kCAAA,uCAAA,SAAA4Z,GA4GA,MA3GAjU,YAAA5B,OAAA8B,QACAG,WAAA,WAEAC,KAAAC,SAAAC,EAAAC,QAAA,mBAAA,gBAAAH,KAAAuT,mBAaAA,iBAAA,SAAAirB,EAAAhgC,GAEA,GAAA,IAAAiB,OAAA2P,KAAAovB,GAAA,CACA,GAAAY,KAKAh1B,GAAAC,KAAArK,KAAAq/B,iBAAAb,GAAA,SAAAn+B,GACA++B,EAAAziC,KAAA0D,EAAAiB,IAAA,QAIA,IAAAwS,GAAA,GAAAH,KAEAjV,GAAA,WACAkU,SAAA,kBACAF,WAAA0sB,IAKAl/B,GAAAC,QAAA,UAAAY,QAAA,oBAAA+S,OAEA,KAAAtV,GAAAA,EAAA2Q,WACA,EAAAiwB,EAAA1jC,SACAwE,EAAAC,QAAA,UAAAkB,QAAA,kBAAA+9B,EAAA,IACAl/B,EAAAC,QAAA,UAAAkB,QAAA,qBAKAnB,GAAAC,QAAA,UAAAY,QAAA,iBAWAs+B,iBAAA,SAAAb,GA4CA,MA3CAA,GAAAA,EAAA3P,cAEA3uB,EAAAC,QAAA,UAAAkB,QAAA,sBAMAqtB,OAAA,SAAAruB,GACA,GAAAi/B,IAAA,CA+BA,QA5BA,GAAAj/B,EAAAiB,IAAA,QAAAutB,cAAA1yB,QAAAqiC,GACAc,GAAA,GACA,GAAAj/B,EAAAiB,IAAA,YAAAutB,cAAA1yB,QAAAqiC,KACAc,GAAA,GAMAj/B,EAAAiB,IAAA,SAAA,GAAAk9B,EAAAriC,QAAA,MACAiO,EAAAC,KAAAhK,EAAAiB,IAAA,QAAA,SAAAmpB,GACA+T,EAAA1iC,QAAA,IAAA,IAAAJ,OAAA,IACA,GAAA+uB,EAAAoE,cAAA1yB,QAAAqiC,EAAA1iC,QAAA,IAAA,OACAwjC,GAAA,KAOAj/B,EAAAiB,IAAA,UACA8I,EAAAC,KAAAhK,EAAAiB,IAAA,SAAA,SAAAi+B,IACA,GAAAA,EAAA1Q,cAAA1yB,QAAAqiC,KACAc,GAAA,KAKAA,SCpGAvlC,EAAA,iCAAA,WA2SA,MA1SA2F,YAAA5B,OAAA8B,QACAG,WAAA,WAEAC,KAAAC,SAAAC,EAAAC,QAAA,mBAAA,iBAAAH,KAAA++B,gBACA/+B,KAAAC,SAAAC,EAAAC,QAAA,mBAAA,gBAAAH,KAAAi/B,mBAEAj/B,KAAAC,SAAAC,EAAAC,QAAA,mBAAA,yBAAAH,KAAA++B,gBACA/+B,KAAAC,SAAAC,EAAAC,QAAA,mBAAA,wBAAAH,KAAAi/B,mBAWA/+B,EAAAC,QAAA,OAAAgF,MAAA,yBAAAnF,KAAAw/B,sBAAAx/B,MACAE,EAAAC,QAAA,OAAAgF,MAAA,sBAAAnF,KAAAy/B,mBAAAz/B,MACAE,EAAAC,QAAA,OAAAgF,MAAA,qBAAAnF,KAAA0/B,kBAAA1/B,MACAE,EAAAC,QAAA,OAAAgF,MAAA,sBAAAnF,KAAA2/B,mBAAA3/B,MACAE,EAAAC,QAAA,OAAAgF,MAAA,uBAAAnF,KAAA4/B,oBAAA5/B,MACAE,EAAAC,QAAA,OAAAgF,MAAA,wBAAAnF,KAAA6/B,qBAAA7/B,OASA++B,eAAA,WACA,GAAAR,GAAAr+B,EAAAC,QAAA,UAAAkB,QAAA,iBACA5B,QAAA8+B,GAAAnyB,SAAA,wBASA6yB,kBAAA,WACA,GAAAV,GAAAr+B,EAAAC,QAAA,UAAAkB,QAAA,iBACA5B,QAAA8+B,GAAA7wB,YAAA,wBAUA8xB,sBAAA,SAAA9uB,GAIA,GAAAjR,OAAAiR,EAAAkL,MAAA6V,SAAA,2BAAA,CAEA,GAAA9e,GAAAlT,OAAAiR,EAAAkL,MAAAvV,KAAA,MAEA+jB,EAAApqB,KAAA4f,SAAAjN,GAAA,EAKAlT,QAAAiR,EAAAH,QAAApW,KAAA,KAAAiwB,GACAlqB,EAAAC,QAAA,UAAAkB,QAAA,eAEA5B,OAAAiR,EAAAH,QAAAjG,SAEApK,EAAAC,QAAA,UAAAY,QAAA,iBAAA4R,EAAAyX,OACA,IAAA3qB,OAAAiR,EAAAkL,MAAA6V,SAAA,YAAA,CAEA,GAAArvB,GAAApC,IAEAE,GAAAC,QAAA,UAAAkB,QAAA,eAEA,IAAAy8B,GAAA59B,EAAAC,QAAA,UAAAkB,QAAA,eAEAk9B,EAAAr+B,EAAAC,QAAA,UAAAkB,QAAA,iBAEA,IAAA5B,OAAA8+B,GAAA9M,SAAA,eAEA,GAAAtS,GAAA1f,OAAA8+B,GAAAluB,SAAA,eAGA,IAAA8O,IAAA,wBAIA,IAAA2gB,GAAA3gB,EAAAhjB,QAAA,wBAIAiO,GAAAC,KAAAyzB,EAAAtzB,OAAA,SAAA2Z,EAAAzmB,GAEA,GAAA0sB,GAAAhoB,EAAAwd,SAAAuE,EAAA7iB,IAAA,QAEA6d,GAAAljB,OAAA6jC,EAAApiC,EAAA,EAAA0sB,IAIA,IAAA0V,GAAA3gB,EAAAhjB,QAAA,wBACAgjB,GAAAljB,OAAA6jC,EAAA,GAEA5/B,EAAAC,QAAA,UAAAkB,QAAA,cAAA8d,GAEAjf,EAAAC,QAAA,UAAAkB,QAAA,iBAEA5B,OAAAiR,EAAAH,QAAAjG,WAaAsV,SAAA,SAAAjN,EAAAsE,GAEAA,EAAAA,IAAA,CAEA,IAAAmI,GAAAlf,EAAAC,QAAA,UAAAkB,QAAA,WAAAsR,GAEAyX,EAAAlqB,EAAAC,QAAA,UAAAkB,QAAA,aAEAooB,EAAAvpB,EAAAC,QAAA,UAAAkB,QAAA,OAAA3C,GAAA0rB,EAAA7V,MAAA6K,EAAA9d,IAAA,YAAAqR,KAAAA,GAAAsE,GAEA1C,GACAqV,OAAA,QACArV,MAAAkV,EAAAnoB,IAAA,SACA8kB,OAAA,QACAH,SAAA,YAGA5f,GACAvC,WAAA5D,EAAAC,QAAA,UAAAkB,QAAA,kBAKA,OAFAnB,GAAAC,QAAA,WAAAkB,QAAA,kBAAA,YAAAooB,EAAA,KAAAlV,EAAAlO,GAEA+jB,GAUAqV,mBAAA,SAAA/uB,GACA,GAAAjR,OAAAiR,EAAAkL,MAAA6V,SAAA,2BAAA,CAEA,GAAA9e,GAAAlT,OAAAiR,EAAAH,QAAAlK,KAAA,MAEA+Y,EAAAlf,EAAAC,QAAA,UAAAkB,QAAA,WAAAsR,GAEA4B,EAAA6K,EAAA9d,IAAA,YAEAi9B,EAAAr+B,EAAAC,QAAA,UAAAkB,QAAA,kBAEA0+B,EAAAtgC,OAAA8+B,GAAAhwB,OAEAvO,MAAAk/B,cAAAxuB,EAAAH,OAEA9Q,OAAAiR,EAAAH,QAAAkC,KAAA8B,GAEA9U,OAAAiR,EAAAH,QAAA7C,YAAA,wBAAAtB,SAAA,iBAAApF,KAAAuH,MAAAwxB,EAAAn5B,OAAA,SAEAnH,OAAA8+B,GAAA9M,SAAA,gBACAhyB,OAAA8+B,GAAAnyB,SAAA,0BAEA,IAAA3M,OAAAiR,EAAAkL,MAAA6V,SAAA,YAAA,CAEA,GAAA8M,GAAAr+B,EAAAC,QAAA,UAAAkB,QAAA,iBACA5B,QAAA8+B,GAAA9M,SAAA,gBACAhyB,OAAA8+B,GAAAnyB,SAAA,wBAaAszB,kBAAA,SAAAhvB,GACA,GAAAjR,OAAAiR,EAAAkL,MAAA6V,SAAA,2BAAA,CAKA,GAAA0N,GAAAj/B,EAAAC,QAAA,mBAAAkB,QAAA,sBAEA5B,QAAAO,KAAAk/B,eAAAzsB,KAAAhT,OAAA0/B,GAAA1sB,QACAhT,OAAAO,KAAAk/B,eAAAxxB,YAAA,iBAAAtB,SAAA,wBAAApF,KAAAuH,MAAA,GAAA3H,OAAA,IAEA,IAAA23B,GAAAr+B,EAAAC,QAAA,UAAAkB,QAAA,iBACA5B,QAAA8+B,GAAA9M,SAAA,gBACAhyB,OAAA8+B,GAAA7wB,YAAA,0BAEA,IAAAjO,OAAAiR,EAAAkL,MAAA6V,SAAA,YAAA,CAEA,GAAA8M,GAAAr+B,EAAAC,QAAA,UAAAkB,QAAA,iBACA5B,QAAA8+B,GAAA9M,SAAA,gBACAhyB,OAAA8+B,GAAA7wB,YAAA,wBAcAiyB,mBAAA,SAAAjvB,GACAjR,OAAAiR,EAAAkL,MAAA5U,IAAA,UAAA,IACAvH,OAAAiR,EAAAH,QAAAjG,SACApK,EAAAC,QAAA,UAAAY,QAAA,gBAAA2P,IAYAkvB,oBAAA,SAAAlvB,GAEAjR,OAAAiR,EAAAkL,MAAA6V,SAAA,4BAAAhyB,OAAAiR,EAAAkL,MAAA6V,SAAA,aACAhyB,OAAAiR,EAAAkL,MAAA5U,IAAA,UAAA,OAAAnD,OAEA3D,EAAAC,QAAA,UAAAY,QAAA,iBAAA2P,IAUAmvB,qBAAA,SAAAnvB,EAAAL,GAKA,GAHAnQ,EAAAC,QAAA,UAAAkB,QAAA,gBAGA5B,OAAAiR,EAAAkL,MAAA6V,SAAA,6BAAAhyB,OAAAiR,EAAAkL,MAAA6V,SAAA,YAAA,CAEA,GAAAxoB,GAAA/I,EAAAC,QAAA,UAAAkB,QAAA,kBACA2+B,EAAAvgC,OAAAiR,EAAAkL,MAAAzhB,KAAA,MAAA2B,QAAA,SAAA,IACAmkC,EAAAh3B,EAAA3H,IAAA0+B,GAGA35B,GAAA6d,UACA9Z,GAAAC,KAAApB,EAAAuB,OAAA,SAAA2Z,GACA,GAAA+b,GAAA/b,EAAA4J,oBAAA5O,MACAiN,EAAAjI,EAAA7iB,IAAA,QAEA+E,GAAA6d,OAAAvnB,MACA0D,MAAA8jB,EACAoE,KAAA,QACAS,OAAAkX,EACAvW,MAAAyC,KAKA,IAAA7X,IACAqV,OAAA,QACArV,MAAA0rB,EAAA3+B,IAAA,SACA8kB,OAAA,mBAAA6Z,EAAAlS,oBAAA5O,MAAA,OAAA8gB,EAAA3+B,IAAA,SACA2kB,SAAA,OAGA/lB,GAAAC,QAAA,WAAAkB,QAAA,kBAAA,aAAA4+B,EAAA,KAAA1rB,EAAAlO,SCvSAtM,EAAA,2BAAA,gCAAA,4BAAA,SAAAkP,EAAAwW,GAyNA,MAxNA/f,YAAA5B,OAAA8B,QACAugC,QAAA,EACAC,UAAA,EAEArgC,WAAA,WAEAC,KAAA8D,WAAA,GAAAmF,GAAAgc,kBAAAf,QAEAlkB,KAAA8D,WAAAoc,cAGAhgB,EAAAC,QAAA,UAAAgF,MAAA,iBAAAnF,KAAAqgC,mBAAArgC,MACAE,EAAAC,QAAA,UAAAgF,MAAA,YAAAnF,KAAAsgC,SAAAtgC,MACAE,EAAAC,QAAA,UAAAgF,MAAA,oBAAAnF,KAAAugC,sBAAAvgC,MACAE,EAAAC,QAAA,UAAAgF,MAAA,YAAAnF,KAAAwgC,cAAAxgC,MAEAE,EAAAC,QAAA,UAAAgF,MAAA,MAAAnF,KAAA4f,SAAA5f,MACAE,EAAAC,QAAA,UAAAgF,MAAA,SAAAnF,KAAAygC,YAAAzgC,MACAE,EAAAC,QAAA,UAAAgF,MAAA,cAAAnF,KAAA0gC,WAAA1gC,MAMAE,EAAAC,QAAA,UAAAgF,MAAA,aAAAnF,KAAA2gC,UAAA3gC,MACAE,EAAAC,QAAA,UAAAgF,MAAA,aAAAnF,KAAA4gC,UAAA5gC,MACAE,EAAAC,QAAA,UAAAgF,MAAA,eAAAnF,KAAA6gC,YAAA7gC,MACAE,EAAAC,QAAA,UAAAgF,MAAA,eAAAnF,KAAA8gC,YAAA9gC,OAGAqgC,mBAAA,WACA,MAAArgC,MAAA8D,YAGAy8B,sBAAA,WACAvgC,KAAA8D,WAAA/C,QAAA,QAAAf,KAAA8D,aAGAw8B,SAAA,SAAA5hC,GACA,MAAAsB,MAAA8D,WAAA+V,WAAApL,IAAA/P,IAIAsB,KAAA8D,WAAA+V,WAAApL,IAAA/P,IAKAsB,KAAA8D,WAAAxC,IAAA5C,IAaAkhB,SAAA,SAAAvZ,EAAA4Q,EAAA8pB,EAAAx0B,GAWA,GANArM,EAAAC,QAAA,UAAAkB,QAAA,cAAA,GAEA4V,EAAAA,IAAA,EACA1K,EAAAA,GAAA,GACAw0B,MAAA,KAAAA,GAAAA,GAEA,GAAA16B,YAAA8C,UAAAC,MAAA,KACA,KAAA/C,EAAA,KACAA,EAAA3H,GAAAsB,KAAAwgC,gBAEA,IAAAngC,GAAA,GAAAof,GAAApZ,OAEA,IAAAhG,GAAAgG,CAYA,IAAA5G,OAAAulB,UAAA3kB,EAAAiB,IAAA,SAAA,CACA,GAAA0/B,GAAA9gC,EAAAC,QAAA,UAAAkB,QAAA,WAAAhB,EAAAiB,IAAA,QACAjB,GAAA6I,IAAA,OAAA83B,EAAA1/B,IAAA,eAGA,GAAAmoB,GAAAzpB,KAAA8D,WAAA4G,IAAArK,GAAA4W,OAAAA,GAaA,OAVA/W,GAAAC,QAAA,OAAAkB,QAAA,iBAAA,SAAA,GACAnB,EAAAC,QAAA,UAAAY,QAAA,YAAAV,GACA0gC,GACA7gC,EAAAC,QAAA,UAAAY,QAAA,kBAAA0oB,EAAAld,GAEA,aAAAA,GACArM,EAAAC,QAAA,UAAAY,QAAA,wBAAA0oB,EAAAld,GAEArM,EAAAC,QAAA,UAAAY,QAAA,iBAAAV,GAEAA,GAYA4gC,mBAAA,SAAAviC,EAAAnE,EAAA0C,GACA+C,KAAA8D,WAAAxC,IAAA5C,GACAwK,IAAA3O,EAAA0C,IAUAyjC,WAAA,SAAAvhB,EAAAzO,EAAAmT,GACA,MAAAA,IACAA,GAAA,EAGA,IAAA0a,GAAAr+B,EAAAC,QAAA,UAAAkB,QAAA,iBACA,IAAA5B,OAAA8+B,GAAA9M,SAAA,eAAA,CAEA,GAAAtS,GAAAA,GAAA1f,OAAA8+B,GAAAluB,SAAA,UAGAjG,GAAAC,KAAArK,KAAA8D,WAAA0G,OAAA,SAAA2Z,GAEA,GACAzlB,IADAylB,EAAA7iB,IAAA,SACA6iB,EAAA7iB,IAAA,MACA,IAAA7B,OAAAulB,UAAAtmB,GACA,GAAA8/B,GAAA,SAAA9/B,MAEA,IAAA8/B,GAAA9/B,CAIA,IAAA0tB,GAAAjN,EAAAhjB,QAAAqiC,GAAA,CACAra,GAAAjb,IAAA,QAAAkjB,KAEApsB,KAAA8D,WAAAqiB,OAEAtC,IAEA3jB,EAAAC,QAAA,OAAAkB,QAAA,iBAAA,SAAA,GAEAnB,EAAAC,QAAA,OAAAkB,QAAA,gBAYAo/B,YAAA,SAAApgC,GACAH,EAAAC,QAAA,UAAAY,QAAA,eAAAV,GACAL,KAAAogC,UAAA,EACApgC,KAAA8D,WAAAwG,OAAAjK,GAGAH,EAAAC,QAAA,OAAAkB,QAAA,iBAAA,SAAA,GACAnB,EAAAC,QAAA,OAAAkB,QAAA,cAWAm/B,cAAA,WACA,GAAA7gB,GAAA3f,KAAA8D,WAAA6b,MAEA,OADA3f,MAAA8D,WAAA6b,SACA,OAAAA,GAGAghB,UAAA,WACA,MAAA3gC,MAAAmgC,QAGAS,UAAA,SAAAvxB,GACArP,KAAAmgC,OAAA9wB,GAGAwxB,YAAA,WACA,MAAA7gC,MAAAogC,UAGAU,YAAA,SAAAzxB,GACArP,KAAAogC,SAAA/wB,OCrNAtV,EAAA,oCAAA,WAkDA,MAjDAoP,UAAAC,MAAAxJ,QACAyJ,UACAua,UACAsd,YAAA,GAGAnhC,WAAA,WAEAC,KAAAM,GAAA,gBAAAN,KAAAmhC,aAAAnhC,OAaAmhC,aAAA,SAAA9gC,GAMA,GAAA,GAAA+J,EAAAg3B,KAAA/gC,EAAAiB,IAAA,WAAA,CAIA,GAAA+/B,IAAA,CACAj3B,GAAAC,KAAAhK,EAAAyD,WAAA0G,OAAA,SAAA82B,GACA,GAAAl3B,EAAAg3B,KAAAE,EAAAhgC,IAAA,aACA+/B,GAAA,KAGAA,GACAhhC,EAAAyD,WAAA+F,aAAAX,IAAA,SAAA,OAMA7I,GAAAyD,WAAA+F,aAAAX,IAAA,SAAA,QC7CAnP,EAAA,uCAAA,kCAAA,SAAAwnC,GAuBA,MAtBAp4B,UAAAK,WAAA5J,QACAS,MAAAkhC,EACA3vB,WAAA,QAEA7R,WAAA,SAAAyK,EAAAwC,GAEAhN,KAAAM,GAAA,OAAAN,KAAA0lB,iBAAA1lB,MAEAA,KAAAM,GAAA,MAAAN,KAAAwhC,UAAAxhC,MACAA,KAAA6J,aAAAmD,EAAAnD,cAGA6b,iBAAA,WAEAxlB,EAAAC,QAAA,mBAAAY,QAAA,eAAAf,MACAE,EAAAC,QAAA,mBAAAH,KAAA6J,aAAAvI,IAAA,SAAAP,QAAA,eAAAf,OAGAwhC,UAAA,SAAAnhC,EAAAyD,GACAzD,EAAA6I,IAAA,eAAAlJ,KAAA6J,mBAKA9P,EAAA,0CAAA,WCbA,MAnBA2F,YAAAC,SAAAC,QACAC,QAAA,MACA+E,UAAA,WACA9E,SAAA,8CAEAkB,gBAAA,WACA,GAAAoB,GAAApC,IACA,QACAyhC,aAAA,WACA,WAAA,KAAAr/B,EAAAwhB,OACAxhB,EAAAwhB,OAAA9lB,OAAA0Q,KAAAoV,QAAA,IAEA,UASA7pB,EAAA,yCAAA,wCAAA,SAAA2nC,GCmIA,MAxJAhiC,YAAA6D,WAAA3D,QACAC,QAAA,MACA+E,UAAA,eACA9E,SAAA,oDACApB,GAAA,WACA,MAAAsB,MAAAK,MAAAslB,KAGAniB,SACAiT,MAAA,oBAGA1W,WAAA,SAAAsG,GACArG,KAAA6J,aAAAxD,EAAAwD,aACA7J,KAAA6L,UAAAxF,EAAAwF,UACA7L,KAAA8D,WAAAuC,EAAAvC,WACA9D,KAAA2hC,QAAAt7B,EAAAs7B,QACA3hC,KAAA4hC,WAAAv7B,EAAAu7B,WACA5hC,KAAAK,MAAAC,GAAA,gBAAAN,KAAAyhC,aAAAzhC,UAKA,KAAAA,KAAA6J,aAAAvI,IAAA,cACAtB,KAAAF,SAAA,IAAAE,KAAA6J,aAAAvI,IAAA,aAGAtB,KAAA6hC,WAAA,GAGA57B,gBAAA,WACAjG,KAAAK,MAAA6F,IAAA,SAAAlG,KAAAI,QACAJ,KAAAK,MAAA6F,IAAA,gBAAAlG,KAAAyhC,eAGAvqB,eAAA,WAIA,GAAAlX,KAAAK,MAAAiB,IAAA,SAAA,CACA,GAAAiT,GAAAvU,KAAAK,MAAAiB,IAAA,QACAtB,MAAAK,MAAA6I,IAAA,QAAAkB,EAAA+M,OAAA5C,IAAA0C,QAAA,MAKA1W,SAAA,WASA,GARAL,EAAAC,QAAA,aAAAkB,QAAA,OAAArB,MAIAE,EAAAC,QAAA,WAAAH,KAAA6J,aAAAvI,IAAA,QAAA,WAAAP,QAAA,iBAAAf,KAAAK,MAAAL,KAAA6L,UAAA7L,MAIAA,KAAAK,MAAAiB,IAAA,SAAA,CACA,GAAAiT,GAAAvU,KAAAK,MAAAiB,IAAA,QACAtB,MAAAK,MAAA6I,IAAA,QAAAkB,EAAA4M,SAAAzC,IAAA0C,QAAA,MAIAjV,OAAA,WACAhC,KAAAK,MAAAiB,IAAA,SACA7B,OAAAO,KAAAiC,IAAAC,KAAA,eAAAoM,QACAtO,KAAAK,MAAA6I,IAAA,OAAA,KAIAtI,QACAqY,kBAAA,eACA6oB,mBAAA,eACAC,MAAA,eAGAC,aAAA,SAAAxjC,GACA0B,EAAAC,QAAA,mBAAAY,QAAA,gBAAAvC,EAAAwB,KAAAK,MAAAL,KAAA6L,UAAA7L,KAAA6J,aAAA7J,OAGAiiC,aAAA,SAAAzjC,GACA0B,EAAAC,QAAA,mBAAAY,QAAA,qBAAAf,KAAAK,MAAAL,KAAA8D,WAAA9D,KAAA6L,UAAA7L,OAGAkiC,YAAA,SAAA1jC,GACAwB,KAAAmiC,eAAA3jC,GACA0B,EAAAC,QAAA,mBAAAY,QAAA,eAAAvC,EAAAwB,KAAAK,MAAAL,KAAA6L,UAAA7L,KAAA6J,aAAA7J,MACAE,EAAAC,QAAA,mBAAAH,KAAA6J,aAAAvI,IAAA,SAAAP,QAAA,eAAAvC,EAAAwB,KAAAK,MAAAL,KAAA6L,UAAA7L,KAAA6J,aAAA7J,OAGAmiC,eAAA,SAAA3jC,GACA,IAAAA,EAAA0Q,SAAA,gBAAAlP,KAAA6J,aAAAvI,IAAA,UACApB,EAAAC,QAAA,mBAAAY,QAAA,kBAAAf,KAAA8D,WAAA9D,KAAA6L,UAAA7L,MACAP,OAAAO,KAAA4hC,WAAAnhC,SAAA2hC,YAAApiC,KAAA4hC,WAAAnhC,SAAA/E,OAAA,GAAAuG,IAAAC,KAAA,qBAAAoM,UAIAmzB,aAAA,WAUA,GAAA3jC,OAAA0Q,KAAAxO,KAAAK,MAAAiB,IAAA,WACAtB,KAAA6hC,YACA7hC,KAAAyW,MAAA/N,QACAjJ,OAAAO,KAAAiC,IAAAyL,YAAA,cAGA1N,KAAA6hC,WAAA,EACA7hC,KAAAyW,MAAA5S,KAAA,GAAA69B,IAAArhC,MAAAL,KAAAK,SACAZ,OAAAO,KAAAiC,IAAAmK,SAAA,cAIApL,gBAAA,WACA,GAAAoB,GAAApC,IACA,QACAqiC,WAAA,WACA,MAAAjgC,GAAAu/B,SAEAW,kBAAA,SAAApP,EAAAj2B,GACA,GAAAinB,GAAAhkB,EAAAC,QAAA,UAAAkB,QAAA,kBACAkhC,EAAA,6DAAArP,EAAA,IAOA,OANAqP,IAAA,gCACAre,EAAA7Z,KAAA,SAAA8Z,GACA,GAAAqe,GAAAvlC,GAAAknB,EAAA7iB,IAAA,OAAA,YAAA,EACAihC,IAAA,kBAAApe,EAAA7iB,IAAA,OAAA,IAAAkhC,EAAA,IAAAre,EAAA7iB,IAAA,SAAA,cAEAihC,GAAA,gCAGAE,cAAA,SAAAC,EAAAzlC,GAEA,OAAA,KAAAmF,EAAA4K,QAAA20B,QAAAe,GAAA,CAEA,GAAAjwB,GAAA,EAMA,OALArI,GAAAC,KAAAjI,EAAA4K,QAAA20B,QAAAe,GAAA11B,QAAA,SAAA4vB,GACA,GAAA4F,GAAAvlC,GAAA2/B,EAAA3/B,MAAA,YAAA,EACAwV,IAAA,kBAAAmqB,EAAA3/B,MAAA,IAAAulC,EAAA,IAAA5F,EAAAroB,MAAA,cAGA9B,UAWA1Y,EAAA,0CAAA,WCtJA,MALA2F,YAAAC,SAAAC,QACAC,QAAA,KACAC,SAAA,kDAKA/F,EAAA,4CAAA,wCAAA,uCAAA,uCAAA,SAAA4oC,EAAAC,EAAAC,GCgQA,MAvQAnjC,YAAA8H,cAAA5H,QACAE,SAAA,6CACAiC,UAAA4gC,EACAzyB,UAAA0yB,EACAvnB,eAAA,EAEAtb,WAAA,SAAAsG,GAMA,GAAAy8B,GAAAz8B,EAAAwF,UAAAvK,IAAAtB,KAAAK,MAAAiB,IAAA,QAEA,IAAAwhC,YAAA35B,UAAAK,aACAs5B,EAAA,GAAAD,OAAAh5B,aAAA7J,KAAAK,QACAyiC,EAAAp4B,IAAArE,EAAAwF,UAAAvK,IAAAtB,KAAAK,MAAAiB,IAAA,UACA+E,EAAAwF,UAAA3C,IAAAlJ,KAAAK,MAAAiB,IAAA,QAAAwhC,GAAA7rB,QAAA,KAGAjX,KAAA8D,WAAAg/B,EACA9iC,KAAA6L,UAAAxF,EAAAwF,UACA7L,KAAAgU,kBAAA4tB,WAAA5hC,KAAA6J,aAAA7J,KAAAK,MAAAyD,WAAA9D,KAAA8D,WAAA+H,UAAAxF,EAAAwF,UAAA81B,QAAA3hC,KAAAK,MAAAiB,IAAA,WAEA,IAAA1C,GAAAoB,KAAAK,MAAAiB,IAAA,OACA,IAAA1C,EACA,IAAA,GAAArE,KAAAqE,GACAA,EAAAZ,eAAAzD,IACAyF,KAAA6L,UAAAvL,GAAA,UAAA/F,EAAAyF,KAAAI,OAAAJ,KAIAA,MAAAC,SAAAC,EAAAC,QAAA,mBAAA,eAAAH,KAAA+iC,cACA/iC,KAAAC,SAAAC,EAAAC,QAAA,mBAAA,iBAAAH,KAAA+iC,eAGA98B,gBAAA,WACA,GAAArH,GAAAoB,KAAAK,MAAAiB,IAAA,OACA,IAAA1C,EACA,IAAA,GAAArE,KAAAqE,GACAA,EAAAZ,eAAAzD,IACAyF,KAAA6L,UAAA3F,IAAA,UAAA3L,EAAAyF,KAAAI,SAMAG,SAAA,WASA,GAAA6B,GAAApC,IACAP,QAAAO,KAAAiC,IAAAC,KAAA,0BAAAmO,UACA2yB,OAAA,UACAzyB,OAAA,QACAD,YAAA,uCACA2yB,sBAAA,EACAhyB,QAAA,IACAT,UAAA,UAEAM,MAAA,SAAAtS,EAAAkS,GACAxQ,EAAAC,QAAA,mBAAAkB,QAAA,uBAAAqP,IAGAK,KAAA,SAAAvS,EAAAkS,GACAxQ,EAAAC,QAAA,mBAAAkB,QAAA,sBAAAqP,IAGAG,OAAA,SAAArS,EAAAkS,GACAxQ,EAAAC,QAAA,mBAAAkB,QAAA,wBAAAqP,EAAA1Q,KAAAoC,MAGAA,EAAA2gC,aAAA3gC,EAAA0B,YAKA5D,EAAAC,QAAA,WAAAH,KAAAK,MAAAiB,IAAA,SAAAP,QAAA,iBAAAf,KAAAK,MAAAL,KAAA6L,UAAA7L,OAIA+F,SAAA,WAEA,GAAAm9B,GAAAzjC,OAAAO,KAAAiC,IAAAC,KAAA,2BACAmV,EAAA5X,OAAAyjC,GAAA7rB,KAAA,WACAoF,MAAA,4CACA1U,QAAAtI,OAAAO,KAAAiC,IAAAC,KAAA,sBACAnB,QAAA,QACAyW,aAAA,OACA2rB,YAAA,MACAz8B,QAAAgW,EAAA,GAAAC,EAAA,GACAvQ,SAAA,iBAEAyf,OAAA,WACA,GAAAzpB,GAAApC,IACAX,YAAA,WAAAI,OAAA2C,EAAA2F,SAAA7F,KAAA,YAAAoM,SAAA,OAIA7O,QAAAO,KAAAiC,IAAAC,KAAA,cAAA5B,GAAA,SAAAoa,KAAA1a,KAAAqX,KAAAA,GAAArX,KAAAojC,aAKAljC,EAAAC,QAAA,WAAAH,KAAAK,MAAAiB,IAAA,SAAAP,QAAA,iBAAAf,KAAAK,MAAAL,KAAA6L,UAAA7L,MACAE,EAAAC,QAAA,gBAAAH,KAAAK,MAAAiB,IAAA,SAAAP,QAAA,iBAAAf,KAAAK,MAAAL,KAAA6L,UAAA7L,OAGAgB,gBAAA,WACA,GAAAoB,GAAApC,IACA,QACAqjC,cAAA,WACA,GAAA1B,GAAA,mBAKA,OAJAv3B,GAAAC,KAAArK,KAAA2hC,QAAA,SAAA2B,GACA3B,GAAA,QAAA2B,EAAAx7B,OAAA,WAEA65B,GAAA,qBAIAlpB,cAAA,WAEA,MADAvY,GAAAC,QAAA,OAAAkB,QAAA,eAAA,yBAAArB,KAAA2S,MACA3S,OAGAmB,cAAA,WACA,GAAAC,GAAA,EAWA,YAVA,KAAApB,KAAAuO,MACAnN,GAAApB,KAAAuO,MAEAnN,GAAA,YAGApB,KAAAyW,QACArV,GAAA,aAGAA,GAGAoX,cAAA,WACA,GAAAxY,KAAApB,KACA,IAAA,GAAArE,KAAAyF,MAAApB,KACA,GAAAoB,KAAApB,KAAAZ,eAAAzD,IACA6H,EAAAyJ,UAAAvK,IAAA/G,KAAAyF,KAAApB,KAAArE,GACA,MAAA,uBAKA,OAAA,IAGAmc,YAAA,WACA,MAAA1W,MAAAyW,MACAzW,KAAAyW,MAEA,IAGA8sB,sBAAA,WACA,MAAAnhC,GAAA/B,MAAAiB,IAAA,SAGA2W,eAAA,WACA,MAAA/X,GAAAC,QAAA,YAAAkB,QAAA,cAAA,aAAA6f,OAAAsiB,mBAKA/7B,WAAA,SAAAC,EAAA3F,GACAtC,OAAAiI,EAAAzF,IAAAC,KAAA,0BAAAyF,OAAA5F,EAAAE,IACA/B,EAAAC,QAAA,aAAAkB,QAAA,OAAArB,OAGAY,QACA6iC,oBAAA,iBACArqB,eAAA,cAGA2pB,aAAA,SAAAj/B,GACA,OAAA,KAAAA,EAAA+F,aAAA,OAAA,CACA,IAAA65B,GAAA5/B,EAAA+F,aAAAvI,IAAA,cACA,KAAAoiC,GAAA5/B,EAAA0G,OAAA9O,QAAA,EACA+D,OAAAO,KAAAiC,IAAAC,KAAA,eAAAkK,SAAA,YAEA3M,OAAAO,KAAAiC,IAAAC,KAAA,eAAAwL,YAAA,aAIAi2B,eAAA,SAAAnlC,GACA0B,EAAAC,QAAA,mBAAAY,QAAA,kBAAAf,KAAA8D,WAAA9D,KAAA6L,WACApM,OAAAO,KAAAS,SAAA2hC,YAAApiC,KAAAS,SAAA/E,OAAA,GAAAuG,IAAAC,KAAA,qBAAAoM,SAGAtC,WAAA,SAAAxN,GACA0B,EAAAC,QAAA,mBAAAY,QAAA,cAAAvC,EAAAwB,KAAA8D,WAAA9D,KAAA6L,WACA3L,EAAAC,QAAA,mBAAAH,KAAAK,MAAAiB,IAAA,SAAAP,QAAA,cAAAvC,EAAAwB,KAAAK,MAAAL,KAAA8D,WAAA9D,KAAA6L,YAGAu3B,YAAA,SAAA5kC,GACA,GAAAolC,GAAAnkC,OAAAjB,EAAA6H,KAAAgR,KAAAtP,SAAA7F,KAAA,YACAjF,EAAA2mC,EAAAv0B,MAAAw0B,WAAAC,WAIA,IAAA,GAAA7mC,EAAAvB,OAEA,MADA8C,GAAA6H,KAAAgR,KAAA8c,SACA,CAMA,IAAA4P,GAAA9mC,EAAA5B,MAAA,KACA+O,GAAA45B,QAAAD,IAIA35B,EAAAC,KAAA05B,EAAA,SAAAE,GACA,GAAAC,GAAAD,EAAA5oC,MAAA,KACAkZ,EAAA2vB,EAAA,GACAjnC,EAAAinC,EAAA,IAAAzkC,OAAA0kC,QAAA5vB,GAAA6vB,UAAA,MACAzX,EAAAuX,EAAA,IAAA,EAEA3vB,GAAAA,EAAAsvB,WAAAC,YACA7mC,EAAAA,EAAA4mC,WAAAC,YACAnX,EAAAA,EAAAkX,WAAAC,WAIA,IAAAzjC,GAAA7B,EAAA6H,KAAAqU,KAAA5W,WAAA4G,KAAA6J,MAAA2vB,EAAA,GAAAjnC,MAAAA,EAAA0vB,KAAAA,IAEApY,GACAqV,OAAA,QACArV,MAAA2vB,EAAA,GACA9d,OAAA,eACAH,SAAA,WAGA/lB,GAAAC,QAAA,WAAAkB,QAAA,kBAAA,gBAAAhB,EAAA,KAAAkU,GACArU,EAAAC,QAAA,mBAAA3B,EAAA6H,KAAAqU,KAAAra,MAAAiB,IAAA,SAAAP,QAAA,aAAAV,GACAH,EAAAC,QAAA,mBAAAY,QAAA,aAAAV,GACAH,EAAAC,QAAA,OAAAY,QAAA,iBAAAV,IACAL,MASA4jC,EAAAv0B,IAAA,IACA7Q,EAAA6H,KAAAgR,KAAA8c,aCxPAp6B,EAAA,kCAAA,iCAAA,sCAAA,4CAAA,SAAAwnC,EAAAsB,EAAAwB,GAoRA,MAnRA3kC,YAAA5B,OAAA8B,QACAG,WAAA,WAEAG,EAAAC,QAAA,mBAAAgF,MAAA,uBAAAnF,KAAA0pB,oBAAA1pB,MAGAA,KAAAC,SAAAC,EAAAC,QAAA,mBAAA,gBAAAH,KAAAgiC,cACAhiC,KAAAC,SAAAC,EAAAC,QAAA,mBAAA,kBAAAH,KAAAwhC,WACAxhC,KAAAC,SAAAC,EAAAC,QAAA,mBAAA,qBAAAH,KAAAiiC,cAGA/hC,EAAAC,QAAA,mBAAAgF,MAAA,wBAAAnF,KAAAskC,qBAAAtkC,MACAE,EAAAC,QAAA,mBAAAgF,MAAA,sBAAAnF,KAAAukC,mBAAAvkC,MACAE,EAAAC,QAAA,mBAAAgF,MAAA,uBAAAnF,KAAAwkC,oBAAAxkC,MAKAA,KAAAC,SAAAC,EAAAC,QAAA,mBAAA,iBAAAH,KAAAykC,kBAYAzC,aAAA,SAAAxjC,EAAA6B,EAAAwL,EAAAhC,EAAA66B,GACA,GAAAnqC,GAAAkF,OAAAjB,EAAAwP,QAAA3H,KAAA,KACA,IAAA,YAAA9L,EACA,GAAAkF,OAAAjB,EAAAwP,QAAAua,KAAA,WACA,GAAAtrB,GAAA,MAEA,IAAAA,GAAA,MAGA,IAAAA,GAAAwC,OAAAjB,EAAAwP,QAAAqB,KAGA,IAAA2Z,GAAA3oB,EAAAiB,IAAA/G,EAEA8F,GAAA6I,IAAA3O,EAAA0C,GAEA+C,KAAA2kC,iBAAAtkC,EAAAwL,EAEA,IAAA8d,GAAA1sB,EAEA+oB,GACAuC,KAAAhuB,EACAyuB,OAAAA,EACAW,MAAAA,GAGApV,GACAqV,OAAA/d,EAAAvK,IAAA,cACAiT,MAAA1I,EAAAvK,IAAA,SACA8kB,OAAA,UAAA/lB,EAAAiB,IAAA,SAAA,IAAA/G,EAAA,iBAAAyuB,EAAA,OAAAW,EAGAzpB,GAAAC,QAAA,WAAAkB,QAAA,kBAAA,gBAAAhB,EAAA2lB,EAAAzR,GACArU,EAAAC,QAAA,mBAAAY,QAAA,gBAAAV,EAAAwL,EAAAhC,EAAA66B,GACAxkC,EAAAC,QAAA,0BAAA5F,GAAAwG,QAAA,gBAAAvC,EAAA6B,EAAAwL,EAAAhC,EAAA66B,GACAxkC,EAAAC,QAAA,mBAAA0J,EAAAvI,IAAA,SAAAP,QAAA,gBAAAV,EAAAwL,EAAAhC,EAAA66B,IAWAlD,UAAA,SAAA19B,EAAA+H,GACA,GAAA+4B,IACAzlB,MAAArb,EAAApI,OACAmpC,KAAA,EACA73B,YAEA02B,EAAA5/B,EAAA+F,aAAAvI,IAAA,cACA,MAAA,IAAAoiC,GAAA5/B,EAAA0G,OAAA9O,QAAAgoC,GAAA,CAGAt5B,EAAAC,KAAAvG,EAAA+F,aAAAvI,IAAA,WAAA,SAAAgiC,EAAA70B,GACAm2B,EAAAn2B,GAAA60B,EAAAwB,YAEA,KAAAxB,EAAAt2B,UACA43B,EAAA53B,QAAAyB,GAAA60B,EAAAt2B,UAGA,IAAA3M,GAAA,GAAAkhC,GAAAqD,EACA9gC,GAAA4G,IAAArK,EAGA,IAAAkU,IACAqV,OAAA/d,EAAAvK,IAAA,cACAiT,MAAA1I,EAAAvK,IAAA,SACA8kB,OAAA,eACAH,SAAA,WAGA/lB,GAAAC,QAAA,WAAAkB,QAAA,kBAAA,gBAAAhB,EAAA,KAAAkU,GACArU,EAAAC,QAAA,mBAAA2D,EAAA+F,aAAAvI,IAAA,SAAAP,QAAA,aAAAV,GACAH,EAAAC,QAAA,mBAAAY,QAAA,aAAAV,GACAH,EAAAC,QAAA,mBAAAY,QAAA,eAAA+C,GACA9D,KAAA2kC,iBAAAtkC,EAAAwL,KAYAo2B,aAAA,SAAA5hC,EAAAyD,EAAA+H,GACA,GAAA4d,GAAAvpB,EAAAC,QAAA,OAAAkB,QAAA,kBAAAhB,GAGAkU,GACAqV,OAAA/d,EAAAvK,IAAA,cACAiT,MAAA1I,EAAAvK,IAAA,SACA8kB,OAAA,UAAAqD,EAAAnoB,IAAA,SAAA,WACA2kB,SAAA,WAGA5f,GACAvC,WAAAA,EAGA5D,GAAAC,QAAA,WAAAkB,QAAA,kBAAA,mBAAAooB,EAAA,KAAAlV,EAAAlO,EAEA,IAAAqf,GAAAxlB,EAAAC,QAAA,WAAAkB,QAAA,kBACA8nB,EAAAzD,EAAA1b,OAAA3J,MAAAA,GAEA+J,GAAAC,KAAA8e,EAAA,SAAAtmB,GACA,gBAAAA,GAAAvB,IAAA,SACA8I,EAAAC,KAAAxH,EAAAvB,IAAA,QAAA,SAAAuK,GACAA,EAAAxL,OAAAwL,IACAA,EAAAxL,MAAAopB,KAIA5mB,EAAAqG,IAAA,QAAAugB,GACA5mB,EAAAqG,IAAA,YAAA,KAGApF,EAAAwG,OAAAjK,GACAH,EAAAC,QAAA,mBAAAY,QAAA,gBAAAV,GACAH,EAAAC,QAAA,mBAAAY,QAAA,iBAAA+C,GACA5D,EAAAC,QAAA,mBAAA2D,EAAA+F,aAAAvI,IAAA,SAAAP,QAAA,gBAAAV,GACAL,KAAA2kC,iBAAAtkC,EAAAwL,IAYA84B,iBAAA,SAAAtkC,EAAAwL,GACA3L,EAAAC,QAAA,OAAAY,QAAA,iBAAAV,IAUAqpB,oBAAA,SAAArpB,GACA,MAAAgkC,IAWAC,qBAAA,SAAA5zB,EAAAL,EAAA0G,GACA,GAAAguB,GAAAtlC,OAAA4Q,GAAAA,SAAA,WACA4vB,EAAAlpB,EAAAjT,WAAAxC,KAAAqkB,IAAAlmB,OAAAiR,EAAAkL,MAAAzhB,KAAA,QACAkM,GACAvC,WAAAiT,EAAAjT,WACAulB,aAGAjf,GAAAC,KAAA06B,EAAA,SAAApf,EAAAjoB,GACA,GAAAgvB,GAAA3V,EAAAjT,WAAAxC,KAAAqkB,IAAAA,IACAua,EAAAxT,EAAAprB,IAAA,QACAorB,GAAAxjB,IAAA,QAAAxL,EACA,IAAA0uB,GAAA1uB,CAEA2I,GAAAgjB,UAAA1sB,MACA0D,MAAAqsB,EACAnE,KAAA,QACAS,OAAAkX,EACAvW,MAAAyC,MAIArV,EAAAjT,WAAAqiB,MAAAlP,QAAA,GAEA,IAAA1C,IACAqV,OAAA7S,EAAAlL,UAAAvK,IAAA,cACAiT,MAAAwC,EAAAlL,UAAAvK,IAAA,SACA8kB,OAAA,UAAA6Z,EAAA3+B,IAAA,SAAA,oBAAA2+B,EAAAlS,oBAAA5O,MAAA,OAAA8gB,EAAA3+B,IAAA,SACA2kB,SAAA,OAGA/lB,GAAAC,QAAA,WAAAkB,QAAA,kBAAA,kBAAA4+B,EAAA,KAAA1rB,EAAAlO,GACArG,KAAA2kC,iBAAA1E,EAAAlpB,EAAAlL,WACA3L,EAAAC,QAAA,mBAAAY,QAAA,cAAAk/B,EAAAlpB,GACA7W,EAAAC,QAAA,mBAAA4W,EAAA1W,MAAAiB,IAAA,SAAAP,QAAA,cAAAk/B,EAAAlpB,IAUAwtB,mBAAA,SAAA7zB,GACAjR,OAAAiR,EAAAkL,MAAA5U,IAAA,UAAA,KAUAw9B,oBAAA,SAAA9zB,GACAjR,OAAAiR,EAAAJ,aAAApO,KAAA,OAAAoI,SACA7K,OAAAiR,EAAAkL,MAAA5U,IAAA,UAAA,OAAAnD,QAWA4gC,gBAAA,SAAA54B,EAAAhC,GAKA,GAAAi5B,GAAAj3B,EAAAvK,IAAAuI,EAAAvI,IAAA,QAEA,IAAAwhC,YAAA35B,UAAAK,aACAs5B,EAAA,GAAAD,OAAAh5B,aAAAA,IACAi5B,EAAAp4B,IAAAmB,EAAAvK,IAAAuI,EAAAvI,IAAA,UACAuK,EAAA3C,IAAAW,EAAAvI,IAAA,QAAAwhC,GAAA7rB,QAAA,UClRAld,EAAA,mCAAA,WAuBA,MAtBA2F,YAAA5B,OAAA8B,QACAG,WAAA,WAEAG,EAAAC,QAAA,UAAAgF,MAAA,mBAAAnF,KAAAglC,gBAAAhlC,MAEAA,KAAAC,SAAAC,EAAAC,QAAA,uBAAA,qBAAAH,KAAAglC,kBASAA,gBAAA,WACA,GAAA/7B,GAAA/I,EAAAC,QAAA,UAAAkB,QAAA,iBACA+I,GAAAC,KAAApB,EAAAuB,OAAA,SAAA2Z,GACAA,EAAAjb,IAAA,cAAA,UClBAnP,EAAA,oCAAA,gCAAA,SAAAiwB,GAsBA,MArBAtqB,YAAA5B,OAAA8B,QACAG,WAAA,WACAC,KAAA8D,WAAA,GAAAkmB,GAAAib,eAAAhmB,WAAA,WAGA/e,EAAAC,QAAA,UAAAgF,MAAA,mBAAAnF,KAAAklC,gBAAAllC,MAGAE,EAAAC,QAAA,UAAAgF,MAAA,wBAAAnF,KAAAmlC,qBAAAnlC,OAGAklC,gBAAA,SAAA3qC,GACA,MAAAyF,MAAA8D,WAAA+V,WAAAtf,KAAAA,KAGA4qC,qBAAA,WACA,MAAAnlC,MAAA8D,gBCjBA/J,EAAA,wCAAA,WA6CA,MA5CA2F,YAAA5B,OAAA8B,QACAG,WAAA,WACAC,KAAAC,SAAAC,EAAAC,QAAA,UAAA,iBAAAH,KAAAolC,sBAGAA,oBAAA,SAAA3lB,GAEA,GAAA,cAAAA,EAAAne,IAAA,QAAA,CAEA,GAAA6d,GAAAM,EAAAne,IAAA,QAEApB,GAAAC,QAAA,UAAAkB,QAAA,SAAAoe,GAEArV,EAAAC,MAAA,qBAAA,mBAAA,gBAAA,uBAAA,iBAAA,SAAAsI,GAEA,GAAAyM,GAAAlf,EAAAC,QAAA,UAAAkB,QAAA,WAAAsR,GAEA0yB,GACA3mC,GAAAwB,EAAAC,QAAA,UAAAkB,QAAA,aACAsR,KAAAA,EACA4B,MAAA6K,EAAA9d,IAAA,YACA6d,MAAAA,EAGAjf,GAAAC,QAAA,UAAAkB,QAAA,MAAAgkC,OAMAC,qBAAA,SAAAjlC,GAEA,cAAAA,EAAAiB,IAAA,UAEApB,EAAAC,QAAA,UAAAkB,QAAA,qBAAA,GAAAhB,GAEA+J,EAAAC,MAAA,qBAAA,mBAAA,gBAAA,uBAAA,iBAAA,SAAAsI,GACAzS,EAAAC,QAAA,UAAAkB,QAAA,kBAAAsR,WCtCA5Y,EAAA,gCAAA,uCAAA,SAAAwrC,GAyDA,MAxDA7lC,YAAA5B,OAAA8B,QACAG,WAAA,WACAC,KAAAC,SAAAC,EAAAC,QAAA,gCAAA,gBAAAH,KAAAwlC,mBACAxlC,KAAAC,SAAAC,EAAAC,QAAA,gCAAA,gBAAAH,KAAAylC,mBAKAzlC,KAAAC,SAAAC,EAAAC,QAAA,eAAA,kBAAAH,KAAA0lC,iBAGAF,kBAAA,SAAAhnC,EAAA6B,EAAAwL,EAAAhC,EAAA66B,GAEA,QAAAt6B,EAAAyP,UAAAqjB,eAAAx+B,GAAAmN,EAAAvK,IAAA,UAAA+d,aAEAhf,EAAAiB,IAAA,kBAEArE,MAAAwC,OAAA0kC,QAAA9jC,EAAAiB,IAAA,UAAA8iC,UAAA,MAEA/jC,EAAA6I,IAAA,QAAAjM,OACAoD,EAAAU,QAAA,SAAAV,GAGAZ,OAAAilC,EAAAziC,IAAAC,KAAA,qBAAAoM,QAAAq3B,YAGAF,kBAAA,SAAAjnC,EAAA6B,EAAAwL,EAAAhC,EAAA66B,GAEA,GAAA7qB,GAAAzP,EAAAyP,UAAAqjB,eAAAx+B,GAAAmN,EAAAvK,IAAA,cACA,KAAAuY,GACA,QAAAA,EAAAwF,aAEAhf,EAAA6I,IAAA,gBAAA,GAGAzJ,OAAAilC,EAAAziC,IAAAC,KAAA,oBAAAoM,QAAAq3B,WAGAD,eAAA,SAAAjmB,GAKA,GAAAzS,GAAAyS,EAAAne,IAAA,WAEAuI,EAAA3J,EAAAC,QAAA,UAAAkB,QAAA,mBAAA,UAEA,IAAA2L,YAAA7D,UAAAK,aACAwD,EAAA,GAAAu4B,OAAA17B,aAAAA,IACAmD,EAAAtC,IAAA+U,EAAAne,IAAA,YACAme,EAAAvW,IAAA,UAAA8D,GAAAiK,QAAA,UCnDAld,EAAA,sCAAA,WAgCA,MA/BA2F,YAAA5B,OAAA8B,QACAG,WAAA,WACAC,KAAAC,SAAAC,EAAAC,QAAA,UAAA,iBAAAH,KAAA4f,WAGAA,SAAA,SAAAvf,GAEA,GAAA,YAAAA,EAAAiB,IAAA,QAAA;8BAEA,GAAA6d,GAAA9e,EAAAiB,IAAA,QAEAtB,MAAA4lC,YAAA,kBAAAzmB,EAAA,GAEAjW,IAAA,gBAAA7I,EAAAiB,IAAA,UAIAskC,YAAA,SAAAjzB,EAAAwM,GACA,GAAAC,GAAAlf,EAAAC,QAAA,UAAAkB,QAAA,WAAAsR,GAEA0yB,GACA3mC,GAAAwB,EAAAC,QAAA,UAAAkB,QAAA,aACAsR,KAAAA,EACA4B,MAAA6K,EAAA9d,IAAA,YACA6d,MAAAA,EAGA,OAAAjf,GAAAC,QAAA,UAAAkB,QAAA,MAAAgkC,QC1BAtrC,EAAA,sCAAA,WA4BA,MA3BA2F,YAAA5B,OAAA8B,QACAG,WAAA,WAEAC,KAAAC,SAAAC,EAAAC,QAAA,OAAA,uBAAAH,KAAAowB,sBAGAA,oBAAA,SAAAvmB,EAAAgC,EAAA6O,GACA,GAAA,sBAAA7Q,EAAAvI,IAAA,QAAA,CACA,GAAAukC,GAAA7lC,KAAA8lC,iBAAAj8B,EACAA,GAAAX,IAAA,UAAA28B,KAIAC,iBAAA,SAAAj8B,GACA,GAAAg8B,IAAAh8B,EAAAvI,IAAA,mBAEA4iB,EAAAhkB,EAAAC,QAAA,UAAAkB,QAAA,iBAMA,OALA+I,GAAAC,KAAA6Z,EAAA1Z,OAAA,SAAA2Z,GACA,WAAAA,EAAA7iB,IAAA,SACAukC,EAAAlpC,MAAA4X,MAAA4P,EAAA7iB,IAAA,SAAArE,MAAAknB,EAAA7iB,IAAA,UAGAukC,OCvBA9rC,EAAA,sCAAA,WAkBA,MAjBA2F,YAAA5B,OAAA8B,QACAG,WAAA,WACAC,KAAAC,SAAAC,EAAAC,QAAA,4BAAA,iBAAAH,KAAA+lC,SACA/lC,KAAAC,SAAAC,EAAAC,QAAA,mCAAA,iBAAAH,KAAA+lC,UAGAA,QAAA,SAAAl8B,EAAAgC,EAAA6O,GACAjb,OAAAib,EAAAzY,IAAAC,KAAA,qBAAAmI,KAAA,WACA5K,OAAAO,MAAA2X,aACAQ,MAAA,IACAP,KAAAC,mBACAC,KAAAC,sBCZAhe,EAAA,4BAAA,WA4HA,MA3HA2F,YAAA5B,OAAA8B,QACAG,WAAA,WAEAC,KAAAC,SAAAC,EAAAC,QAAA,UAAA,YAAAH,KAAAgmC,aAGAhmC,KAAAC,SAAAC,EAAAC,QAAA,sBAAA,iBAAAH,KAAAimC,aAGAjmC,KAAAC,SAAAC,EAAAC,QAAA,oBAAA,iBAAAH,KAAA8pB,WAGA9pB,KAAAC,SAAAC,EAAAC,QAAA,eAAA,gBAAAH,KAAAg8B,QAUAgK,YAAA,SAAA3lC,GACA,GAAA6lC,GAAA,GAAAC,MACA/nC,EAAA8nC,EAAAE,UACA33B,EAAAzO,KAAAmkC,QAAA9jC,EAAAiB,IAAA,QAAA,IAAAlD,EAEAiC,GAAA6I,IAAA,MAAAuF,GAAAwI,QAAA,IAEA,aAAA5W,EAAAiB,IAAA,eACAjB,EAAA6I,IAAA,cAAA,GAAA+N,QAAA,KAIAgvB,YAAA,SAAA5lC,GAKA,IAAAA,EAAAiB,IAAA,eAAA,GAAA7B,OAAA2P,KAAA/O,EAAAiB,IAAA,UAAA5F,OAAA,OAOA2E,GAAAy4B,QAAAvkB,KACA,IAAA2xB,GAAA,GAAAC,MACA/nC,EAAA8nC,EAAAE,UACA33B,EAAAzO,KAAAmkC,QAAA9jC,EAAAiB,IAAA,SAAA,IAAAlD,EACAiC,GAAA6I,IAAA,MAAAuF,KAWAqb,UAAA,SAAAje,GACA,GAAA4C,GAAA5C,EAAAvK,IAAA,MACAtB,MAAA6J,aAAA3J,EAAAC,QAAA,UAAAkB,QAAA,mBAAA,OACArB,KAAAqmC,SAAA53B,EAAA5C,IAGAmwB,MAAA,SAAAx9B,EAAAqL,EAAAgC,GACAA,EAAA3C,IAAA,cAAA,GACAlJ,KAAA6J,aAAAA,CACA,IAAA4E,GAAAhP,OAAAjB,EAAAwP,QAAAqB,KACArP,MAAAqmC,SAAA53B,EAAA5C,IAGAw6B,SAAA,SAAA53B,EAAA5C,GACA,GAAA4K,IAAA,CACA,KAAAhX,OAAA2P,KAAAX,GACAgI,EAAA,iDACAhI,GAAAA,EAAAogB,cACApY,EAAA,gCACAhI,GAAAA,EAAA3S,QAAA,IAAA,KACA2a,EAAA,gEACA,KAAAhI,EAAA1S,OAAA,GACA0a,EAAA,mCACAhI,GAAAzO,KAAAmkC,QAAA11B,GACAgI,EAAA,kBACAhI,GAAAzO,KAAAsmC,UAAA73B,EAAA5C,KACA4K,EAAA,wDAGAA,EACAzW,KAAA6J,aAAAX,IAAA,QAAAuN,IAEAvW,EAAAC,QAAA,OAAAY,QAAA,kBAAA8K,GACA7L,KAAA6J,aAAAX,IAAA,SAAA,KAIAo9B,UAAA,SAAA73B,EAAA5C,GACA,GAAAgiB,GAAA7tB,KAAAmkC,QAAA11B,EACA,IAAAof,EAAAnyB,SACA+S,EAAAof,EAEA,IAAA5kB,GAAA/I,EAAAC,QAAA,UAAAkB,QAAA,kBACAqb,EAAA,EACA6pB,EAAA93B,CAUA,OATArE,GAAAC,KAAApB,EAAAuB,OAAA,SAAA2Z,GACAtY,GAAAsY,GAAAoiB,GAAApiB,EAAA7iB,IAAA,SACAilC,EAAA93B,EAAA,IAAAiO,EACAA,OAIAjO,EAAA83B,GAKApC,QAAA,SAAApS,GACA,MAAAtyB,QAAA0kC,QAAApS,GAAAqS,UAAA,WC1HArqC,EAAA,gCAAA,WAWA,MAVA2F,YAAA5B,OAAA8B,QACAG,WAAA,WACAC,KAAAC,SAAAC,EAAAC,QAAA,UAAA,kBAAAH,KAAAg+B,iBAGAA,eAAA,SAAA39B,GACAH,EAAAC,QAAA,WAAAkB,QAAA,MAAA,iBAAAhB,EAAAiB,IAAA,YAAA,0BCPAvH,EAAA,+BAAA,WAkCA,MAjCA2F,YAAA5B,OAAA8B,QACAG,WAAA,WAIAC,KAAAC,SAAAC,EAAAC,QAAA,UAAA,iBAAAH,KAAAwmC,aAEAxmC,KAAAC,SAAAC,EAAAC,QAAA,UAAA,gBAAAH,KAAAymC,aAGAC,WAAA,SAAAhsB,GACAxa,EAAAC,QAAA,OAAAkB,QAAA,cACA5B,OAAAib,EAAAzY,IAAAC,KAAA,kBAAA5B,GAAA,UAAA,WACAb,OAAAO,MAAA2mC,aAAA,SAAAC,SAAA,MAAA,IAAA,MAAA,IAAA,OAAA,KAAA,OAAA,KAAAC,MAAA,QAKAL,YAAA,SAAA91B,GACAxQ,EAAAC,QAAA,OAAAkB,QAAA,eACA5B,OAAAiR,EAAAkL,MAAAlO,YAAA,sBAAAi5B,aAAA,QACAlnC,OAAAiR,EAAAH,QAAAvJ,IAAA,UAAA,QAAA2/B,aAAA,SAAAC,SAAA,KAAA,IAAA,KAAA,IAAA,MAAA,KAAA,MAAA,SAIAH,WAAA,SAAA/1B,GACAxQ,EAAAC,QAAA,OAAAkB,QAAA,eACA5B,OAAAiR,EAAAH,QAAAo2B,aAAA,QACAlnC,OAAAiR,EAAAkL,MAAAlO,YAAA,0CC7BA3T,EAAA,oCAAA,WAiFA,MAhFA2F,YAAA5B,OAAA8B,QACAyoB,kBACA,aACA,QACA,QACA,QAGAtoB,WAAA,WACAC,KAAAC,SAAAC,EAAAC,QAAA,UAAA,iBAAAH,KAAA8mC,aAEA9mC,KAAAC,SAAAC,EAAAC,QAAA,UAAA,sBAAAH,KAAAkc,mBAAAlc,OAGA8mC,YAAA,SAAAj7B,GACA,GAAAA,EAAAvK,IAAA,SAAA,CAEA,GAAAylC,IAAA,EACAxnB,EAAAnV,EAAAoE,KAAA3C,EAAA0T,qBACAnd,EAAApC,IACAoK,GAAAC,KAAAkV,EAAA,SAAAuZ,IACA,GAAA12B,EAAAimB,iBAAAlsB,QAAA28B,KACAiO,GAAA,KAIAA,GACAl7B,EAAA3C,IAAA,SAAA,KAKAgT,mBAAA,SAAA1d,EAAAqN,GACA,GAAAm7B,GAAA9mC,EAAAC,QAAA,OAAAkB,QAAA,kBAAAwK,GAEAo7B,EAAAD,EAAAzd,UACA0d,GAAAhqB,OAAA,QAEAgqB,GAAA5vB,WACA4vB,GAAAloB,iBACAkoB,GAAAC,iBACAD,GAAA9nB,YACA8nB,GAAAvoC,SACAuoC,GAAAE,aACAF,GAAA7iB,SAEA,IAAAzR,GAAAzS,EAAAC,QAAA,UAAAkB,QAAA,WAAA4lC,EAAAt0B,MACAy0B,EAAAh9B,EAAAiB,MAAAsH,EAAA4W,YAEA3W,EAAAnT,OAAAjB,EAAAwP,QAAAlI,SAAAA,SAAA5D,KAAA,SAAAmN,KACAiJ,SAAAC,IAAA3F,GACAw0B,EAAAx0B,SAAAA,EACAq0B,EAAA1yB,MAAA3B,EACAq0B,EAAAr0B,SAAAA,EACA/G,EAAA3C,IAAA,mBAAA,EACA,IAAAm+B,GAAAv6B,KAAAmX,UAAAgjB,EAEAxnC,QAAAkN,KAAAC,SAAAL,OAAA,wBAAA4X,MAAAkjB,EAAA76B,SAAAC,QAAAC,WAAA,SAAAG,GACAA,EAAAC,KAAAC,MAAAF,GACAu6B,EAAA1oC,GAAAmO,EAAAxG,KAAA3H,GACA0oC,EAAAx0B,SAAAA,EACAw0B,EAAAE,gBAAAL,CAEA,IAAAM,GAAArnC,EAAAC,QAAA,UAAAkB,QAAA,qBACAkmC,GAAA78B,IAAA08B,EAEAlnC,GAAAC,QAAA,UAAAkB,QAAA,oBACAC,IAAA,SAAAA,IAAA,cAAA3E,KAAAyqC,EAAA1oC,IAGAmN,EAAA3C,IAAA,mBAAA,GACA2C,EAAA2Q,MAAA,mBAAAvF,QAAA,IACApL,EAAAvK,IAAA,QAAA6yB,QAGAj0B,EAAAC,QAAA,WAAAkB,QAAA,MAAA,WAAA,4BC1EAtH,EAAA,wCAAA,WAWA,MAVA2F,YAAA5B,OAAA8B,QACAG,WAAA,WACAC,KAAAC,SAAAC,EAAAC,QAAA,2BAAA,iBAAAH,KAAAwnC,gBAGAA,cAAA,SAAA39B,EAAAgC,EAAA6O,GACA+sB,kBAAAhoC,OAAAib,EAAAzY,IAAAC,KAAA,YAAA,SCPAnI,EAAA,yCAAA,WAyBA,MAxBA2F,YAAA5B,OAAA8B,QACAG,WAAA,WAEAC,KAAAC,SAAAC,EAAAC,QAAA,oBAAA,uBAAAH,KAAAowB,sBAGAA,oBAAA,SAAAvmB,EAAAgC,EAAA6O,KAIAorB,iBAAA,SAAAj8B,GACA,GAAAg8B,IAAAh8B,EAAAvI,IAAA,mBAEA4iB,EAAAhkB,EAAAC,QAAA,UAAAkB,QAAA,iBAMA,OALA+I,GAAAC,KAAA6Z,EAAA1Z,OAAA,SAAA2Z,GACA,WAAAA,EAAA7iB,IAAA,SACAukC,EAAAlpC,MAAA4X,MAAA4P,EAAA7iB,IAAA,SAAArE,MAAAknB,EAAA7iB,IAAA,UAGAukC,OClBA9rC,EAAA,6BAAA,6BAAA,SAAA+iC,GA8FA,MA7FAp9B,YAAA5B,OAAA8B,QACAG,WAAA,WAKAC,KAAA+V,iBAAA,GAAA+mB,GACA1yB,EAAAskB,OAAAgZ,eAAA,SAAA/0B,GACA,MAAA,aAAAA,EAAA4C,WAIAI,KAAA,YACA/C,SAAAsO,OAAAymB,YAIA3nC,KAAAgW,iBAAA,GAAA8mB,GACA1yB,EAAAskB,OAAAgZ,eAAA,SAAA/0B,GACA,MAAA,aAAAA,EAAA4C,WAIAI,KAAA,YACA/C,SAAAsO,OAAA0mB,YAKA1nC,EAAAC,QAAA,WAAAgF,MAAA,WAAAnF,KAAA6nC,QAAA7nC,MACAE,EAAAC,QAAA,WAAAgF,MAAA,uBAAAnF,KAAA8nC,oBAAA9nC,MACAE,EAAAC,QAAA,WAAAgF,MAAA,uBAAAnF,KAAA+nC,oBAAA/nC,OAUA6nC,QAAA,SAAAnpC,GAEA,GAAAiU,GAAA3S,KAAA+V,iBAAAzU,IAAA5C,EAIA,OAHAiU,KACAA,EAAA3S,KAAAgW,iBAAA1U,IAAA5C,IAEAiU,GASAm1B,oBAAA,WACA,MAAA9nC,MAAA+V,kBASAgyB,oBAAA,WACA,MAAA/nC,MAAAgW,kBAUAgoB,eAAA,SAAAx/B,GACA,GAAAmU,GAAAlT,OAAAjB,EAAAwP,QAAA3H,KAAA,KACAnG,GAAAC,QAAA,UAAAkB,QAAA,kBAAAsR,IASA0qB,gBAAA,WACA,MAAAr9B,MAAAg9B,uBC9FAjjC,EAAA,gCAAA,WAwDA,MAvDAoP,UAAAC,MAAAxJ,QACAyJ,UACA4V,WAAA,SACAC,aAAA,UACAH,YAAA,GAGAhf,WAAA,WAEAC,KAAAM,GAAA,SAAAN,KAAAqZ,cAAArZ,KAGA,IAAAgoC,GAAA9nC,EAAAC,QAAA,WAAAkB,QAAA,WAAArB,KAAAsB,IAAA,QAEA,QAAA,KAAA0mC,EAAA,CAGA,GAAA5lC,GAAApC,IACAoK,GAAAC,KAAA29B,EAAA1mC,IAAA,mBAAA,SAAA+N,EAAAZ,GACArM,EAAAd,IAAAmN,IACArM,EAAA8G,IAAAuF,EAAAY,GAAA4H,QAAA,MAYA/W,EAAAC,QAAA,WAAAY,QAAA,mBAAAf,MACAE,EAAAC,QAAA,WAAAH,KAAAsB,IAAA,SAAAP,QAAA,mBAAAf,MAEAA,KAAAC,SAAAC,EAAAC,QAAA,OAAA,sBAAAH,KAAAsf,kBASAjG,cAAA,SAAAhZ,EAAA2M,GACA9M,EAAAC,QAAA,iBAAAiK,EAAAoE,KAAAxO,KAAAuf,qBAAA,IAAAxe,QAAA,iBAAAf,KAAAgN,EAAAnD,cACA3J,EAAAC,QAAA,WAAAY,QAAA,iBAAAf,KAAAgN,EAAAnD,cACA3J,EAAAC,QAAA,OAAAY,QAAA,iBAAAf,KAAAgN,EAAAnD,eAGAyV,eAAA,SAAAE,EAAA3V,GACA3J,EAAAC,QAAA,OAAAY,QAAA,mBAAAf,KAAAwf,EAAA3V,QCjDA9P,EAAA,mCAAA,8BAAA,SAAAg/B,GAiCA,MAhCA5vB,UAAAK,WAAA5J,QACAS,MAAA04B,EACAnnB,WAAA,QACA+N,OAAA,EAEA5f,WAAA,WACAC,KAAAM,GAAA,MAAAN,KAAAioC,UAAAjoC,MACAA,KAAAM,GAAA,SAAAN,KAAAkoC,aAAAloC,MACAA,KAAAigB,WAUAgoB,UAAA,SAAA5nC,GACAL,KAAAigB,OAAAtjB,KAAA0D,EAAAiB,IAAA,QASA4mC,aAAA,SAAA7nC,GACAL,KAAAkgB,WAAA7f,EAAAiB,IAAA,OAAAjB,EAAAiB,IAAA,WCjCAvH,EAAA,4BAAA,kCAAA,8BAAA,SAAAqjB,EAAA2b,GAwFA,MAvFAr5B,YAAA5B,OAAA8B,QACAG,WAAA,WAKA,GAHAC,KAAA8D,WAAA,GAAAsZ,GAAA6H,kBAAAX,SACAtkB,KAAA8D,WAAA6b,OAAA,EAEA,GAAA3f,KAAA8D,WAAA0G,OAAA9O,OAAA,CACA,GAAA0G,GAAApC,IACAoK,GAAAC,KAAArK,KAAA8D,WAAA0G,OAAA,SAAA+B,GACA9M,OAAAulB,UAAAzY,EAAAjL,IAAA,QACAc,EAAA0B,WAAA6b,WAKA3f,KAAA8D,WAAAoc,cAGAhgB,EAAAC,QAAA,WAAAgF,MAAA,iBAAAnF,KAAA8lB,cAAA9lB,MACAE,EAAAC,QAAA,WAAAgF,MAAA,aAAAnF,KAAAmoC,UAAAnoC,MACAE,EAAAC,QAAA,WAAAgF,MAAA,YAAAnF,KAAAooC,SAAApoC,MAEAE,EAAAC,QAAA,WAAAgF,MAAA,MAAAnF,KAAAioC,UAAAjoC,MACAE,EAAAC,QAAA,WAAAgF,MAAA,SAAAnF,KAAAqoC,aAAAroC,OAGA8lB,cAAA,WACA,MAAA9lB,MAAA8D,YAGAqkC,UAAA,SAAAzpC,GACA,MAAAsB,MAAA8D,WAAAxC,IAAA5C,IAUAupC,UAAA,SAAA5hC,EAAA4Q,GAGA,GAFAA,EAAAA,IAAA,GAEA,GAAA5Q,YAAA8C,UAAAC,MACA,GAAA/I,GAAA,GAAA04B,GAAA1yB,OAEA,IAAAhG,GAAAgG,CAOA,OAJArG,MAAA8D,WAAA4G,IAAArK,GAAA4W,OAAAA,IAEA/W,EAAAC,QAAA,OAAAkB,QAAA,iBAAA,SAAA,GAEAhB,GAUAgoC,aAAA,SAAAhoC,GACAL,KAAA8D,WAAAwG,OAAAjK,GAEAH,EAAAC,QAAA,OAAAkB,QAAA,iBAAA,SAAA,GACAnB,EAAAC,QAAA,OAAAkB,QAAA,cAYA+mC,SAAA,WACA,GAAAzoB,GAAA3f,KAAA8D,WAAA6b,MAEA,OADA3f,MAAA8D,WAAA6b,SACA,OAAAA,OCpFA5lB,EAAA,sCAAA,gCAAA,SAAAiwB,GAeA,MAdAtqB,YAAA5B,OAAA8B,QACAG,WAAA,WACAC,KAAA8D,WAAA,GAAAkmB,GAAAse,gBAAArpB,WAAA,YAGA/e,EAAAC,QAAA,WAAAgF,MAAA,mBAAAnF,KAAAklC,gBAAAllC,OAGAklC,gBAAA,SAAA3qC,GACA,MAAAyF,MAAA8D,WAAA+V,WAAAtf,KAAAA,SCVAR,EAAA,oCAAA,WAuBA,MAtBA2F,YAAA5B,OAAA8B,QACAG,WAAA,WAEAG,EAAAC,QAAA,WAAAgF,MAAA,mBAAAnF,KAAAglC,gBAAAhlC,MAEAA,KAAAC,SAAAC,EAAAC,QAAA,uBAAA,qBAAAH,KAAAglC,kBASAA,gBAAA,WACA,GAAA5nB,GAAAld,EAAAC,QAAA,WAAAkB,QAAA,iBACA+I,GAAAC,KAAA+S,EAAA5S,OAAA,SAAA+B,GACAA,EAAArD,IAAA,cAAA,UCpBAnP,EAAA,0CAAA,WA0BA,MAzBA2F,YAAA5B,OAAA8B,QACAG,WAAA,WACAC,KAAAC,SAAAC,EAAAC,QAAA,8BAAA,iBAAAH,KAAAuoC,oBAGAA,kBAAA,SAAA18B,EAAAhC,GACA,OAAA,KAAAA,EAAA,CAEA,GAAA5M,GAAA4O,EAAAvK,IAAA,gBAAA8N,MAEA,OAAA,oBAAAnS,EACA4M,EAAAX,IAAA,WAAA,GAGAjM,IAAA+C,KAAAwoC,aAAAvrC,IAAAwP,QAAAg8B,eAAAxrC,EAAAnB,QAAA,MAAA,IACA+N,EAAAX,IAAA,UAAAgY,OAAAwnB,8BAGA7+B,EAAAX,IAAA,WAAA,KAGAs/B,aAAA,SAAAG,GACA,MAAA,cAAA9sC,KAAA8sC,QCrBA5uC,EAAA,sCAAA,kCAAA,8BAAA,SAAAqjB,EAAA2b,GAyCA,MAxCAr5B,YAAA5B,OAAA8B,QACAG,WAAA,WACAC,KAAAC,SAAAC,EAAAC,QAAA,WAAA,kBAAAH,KAAAioC,WAEA/nC,EAAAC,QAAA,WAAAgF,MAAA,iBAAAnF,KAAAioC,UAAAjoC,OAUAioC,UAAA,SAAAt1B,GAEA,GAAAtM,IACA3H,GAAAwB,EAAAC,QAAA,WAAAkB,QAAA,aACAsR,KAAAA,EAAArR,IAAA,MACAiT,MAAA5B,EAAArR,IAAA,mBAAAiT,OAAA5B,EAAArR,IAAA,aAGAmoB,EAAAvpB,EAAAC,QAAA,WAAAkB,QAAA,MAAAgF,GAEAkO,GACAqV,OAAA,SACArV,MAAAkV,EAAAnoB,IAAA,SACA8kB,OAAA,QACAH,SAAA,YAGA5f,GACAvC,WAAA5D,EAAAC,QAAA,WAAAkB,QAAA,kBAGAnB,GAAAC,QAAA,WAAAkB,QAAA,kBAAA,YAAAooB,EAAA,KAAAlV,EAAAlO,GACAnG,EAAAC,QAAA,OAAAY,QAAA,gBAAA0oB,QCrCA1vB,EAAA,kCAAA,WAsDA,MArDA2F,YAAA5B,OAAA8B,QACAG,WAAA,WAEAC,KAAAC,SAAAC,EAAAC,QAAA,oBAAA,iBAAAH,KAAAw9B,WACAx9B,KAAAC,SAAAC,EAAAC,QAAA,oBAAA,gBAAAH,KAAAy9B,UAKAv9B,EAAAC,QAAA,oBAAAgF,MAAA,sBAAAnF,KAAA09B,+BAAA19B,OAgBAw9B,UAAA,SAAAl4B,EAAAoL,GACA1Q,KAAA4N,SAAA1N,EAAAC,QAAA,OAAAkB,QAAA,gBACArB,KAAAknB,OAAAhnB,EAAAC,QAAA,OAAAkB,QAAA,cACA5B,OAAAO,KAAA4N,UAAA,GAAA+vB,MAAAC,YAAA,WAAA,UAAA,aAGA59B,KAAA69B,qBAAAp+B,OAAAiR,EAAAH,QAAAlF,SAYAoyB,SAAA,SAAAn4B,EAAAoL,GACAjR,OAAAO,KAAA4N,UAAA,GAAA+vB,MAAAC,YAAA,WAAA,SAAA,cAIAF,+BAAA,WACA,MAAA19B,MAAA69B,0BClDA9jC,EAAA,mCAAA,WAiBA,MAhBA2F,YAAA5B,OAAA8B,QACAG,WAAA,WAKAG,EAAAC,QAAA,OAAAgF,MAAA,kBAAAnF,KAAA4oC,eAAA5oC,OAGA4oC,eAAA,SAAApqC,EAAAkS,GACA,GAAAm4B,GAAAppC,OAAAiR,EAAAH,QAAAlK,KAAA,QACAsM,EAAAzS,EAAAC,QAAA,WAAAkB,QAAA,WAAAwnC,EACA3oC,GAAAC,QAAA,WAAAkB,QAAA,iBAAAsR,QCbA5Y,EAAA,8BAAA,WAKA,MAJAoP,UAAAC,MAAAxJ,aCDA7F,EAAA,iCAAA,4BAAA,SAAA+uC,GAIA,MAHA3/B,UAAAK,WAAA5J,QACAS,MAAAyoC,MCFA/uC,EAAA,mCAAA,iCAAA,SAAAwtC,GAoHA,MAnHA7nC,YAAA5B,OAAA8B,QACAG,WAAA,WAEAC,KAAAC,SAAAC,EAAAC,QAAA,oBAAA,gBAAAH,KAAA+oC,oBAaAA,kBAAA,SAAAvK,EAAAhgC,GAGA,GAAA,IAAAiB,OAAA2P,KAAAovB,GAAA,CAEA,GAAAvoB,MAKAF,EAAA7V,EAAAC,QAAA,WAAAkB,QAAA,uBACA+I,GAAAC,KAAArK,KAAAq/B,iBAAAb,EAAAzoB,GAAA,SAAA1V,GACA4V,EAAAtZ,KAAA0D,IAGA,IAAA6V,MACAF,EAAA9V,EAAAC,QAAA,WAAAkB,QAAA,uBACA+I,GAAAC,KAAArK,KAAAq/B,iBAAAb,EAAAxoB,GAAA,SAAA3V,GACA6V,EAAAvZ,KAAA0D,IAIA,IAAA2oC,GAAA,GAAAzB,GAAAtxB,EACA+yB,GAAArzB,KAAA,YACAqzB,EAAAp2B,SAAA,WAEA,IAAAq2B,GAAA,GAAA1B,GAAArxB,EACA+yB,GAAAtzB,KAAA,YACAszB,EAAAr2B,SAAA,YAGA1S,EAAAC,QAAA,UAAAY,QAAA,qBAAAioC,EAAAC,GAEAzqC,EAAA2Q,WACA,EAAA65B,EAAAttC,SACAwE,EAAAC,QAAA,WAAAkB,QAAA,iBAAA2nC,EAAAx+B,OAAA,IACAtK,EAAAC,QAAA,UAAAkB,QAAA,qBAKAnB,GAAAC,QAAA,UAAAY,QAAA,iBAWAs+B,iBAAA,SAAAb,EAAA16B,GA2CA,MA1CA06B,GAAAA,EAAA3P,cAMA/qB,EAAA4qB,OAAA,SAAAruB,GACA,GAAAi/B,IAAA,CA+BA,QA5BA,GAAAj/B,EAAAiB,IAAA,MAAAutB,cAAA1yB,QAAAqiC,GACAc,GAAA,GACA,GAAAj/B,EAAAiB,IAAA,YAAAutB,cAAA1yB,QAAAqiC,KACAc,GAAA,GAMAj/B,EAAAiB,IAAA,SAAA,GAAAk9B,EAAAriC,QAAA,MACAiO,EAAAC,KAAAhK,EAAAiB,IAAA,QAAA,SAAAmpB,GACA+T,EAAA1iC,QAAA,IAAA,IAAAJ,OAAA,IACA,GAAA+uB,EAAAoE,cAAA1yB,QAAAqiC,EAAA1iC,QAAA,IAAA,OACAwjC,GAAA,KAOAj/B,EAAAiB,IAAA,UACA8I,EAAAC,KAAAhK,EAAAiB,IAAA,SAAA,SAAAi+B,IACA,GAAAA,EAAA1Q,cAAA1yB,QAAAqiC,KACAc,GAAA,KAKAA,SC9GAvlC,EAAA,wCAAA,WA6GA,MA5GA2F,YAAA5B,OAAA8B,QACAG,WAAA,WACAC,KAAAC,SAAAC,EAAAC,QAAA,2BAAA,eAAAH,KAAAkpC,eACAlpC,KAAAC,SAAAC,EAAAC,QAAA,gCAAA,cAAAH,KAAAmpC,iBACAnpC,KAAAC,SAAAC,EAAAC,QAAA,iCAAA,iBAAAH,KAAAopC,mBACAppC,KAAAC,SAAAC,EAAAC,QAAA,iCAAA,iBAAAH,KAAAqpC,mBACArpC,KAAAC,SAAAC,EAAAC,QAAA,uCAAA,oBAAAH,KAAAspC,wBACAtpC,KAAAC,SAAAC,EAAAC,QAAA,uCAAA,oBAAAH,KAAAupC,yBAGAL,cAAA,SAAAr/B,EAAAgC,GACA7L,KAAAopC,kBAAAv9B,EAAAhC,GACA7J,KAAAqpC,kBAAAx9B,EAAAhC,IAGAy/B,uBAAA,SAAAjpC,GACAA,EAAAJ,SAAAC,EAAAC,QAAA,0BAAA,sBAAAH,KAAAwpC,mBAAAnpC,IAGAkpC,uBAAA,SAAAlpC,GACAA,EAAAJ,SAAAC,EAAAC,QAAA,0BAAA,wBAAAH,KAAAypC,qBAAAppC,IAGA8oC,gBAAA,SAAA3qC,EAAAqL,EAAAgC,EAAAK,GAEA,GAAA7F,IACAkG,OAAA,MAAAV,EAAA0d,WAAA5W,KAAA,aACAnG,SAAAC,QAAAC,WAGAtK,EAAApC,IACAP,QAAAjB,EAAA2N,YAAAC,SAAA,QACA3M,OAAAkN,KAAAC,QAAAvG,EAAA,SAAAwG,GACA,GAAAA,GAAAC,KAAAC,MAAAF,EACAzK,GAAAsnC,YAAA7/B,EAAAgD,EAAA88B,MAAAz9B,EAAAL,GACAA,EAAA3C,IAAA,kBAAA2D,EAAA88B,MAAA,GAAA1sC,OAAA4M,aAAAA,MACA+/B,OAAA,WACAnqC,OAAAjB,EAAA2N,YAAAuB,YAAA,WAIAg8B,YAAA,SAAA7/B,EAAA8/B,EAAAz9B,EAAAL,GACAhC,EAAAX,IAAA,UAAAygC,GACAz9B,EAAA9L,UAGAgpC,kBAAA,SAAAv9B,EAAAhC,GAEA,OAAA,KAAAA,EAAA,CAEA,GAAAggC,GAAAh+B,EAAAvK,IAAA,mBACAqoC,EAAA9/B,EAAAvI,IAAA,UACA8I,GAAAC,KAAAs/B,EAAA,SAAAG,GACAD,GAAAC,EAAA7sC,OACAiD,EAAAC,QAAA,0BAAAY,QAAA,sBAAA+oC,EAAA5lB,UAIArY,EAAA3C,IAAA,yBAAA,KAGAmgC,kBAAA,SAAAx9B,EAAAhC,GACA,OAAA,KAAAA,EAAA,CAEA,GAAAggC,GAAAh+B,EAAAvK,IAAA,mBACAqoC,EAAA9/B,EAAAvI,IAAA,UACA8I,GAAAC,KAAAs/B,EAAA,SAAAG,GACAD,GAAAC,EAAA7sC,OACAiD,EAAAC,QAAA,0BAAAY,QAAA,wBAAA+oC,EAAAC,UAIAl+B,EAAA3C,IAAA,yBAAA,KAGAsgC,mBAAA,SAAAtlB,GACA,GAAA/P,GAAAnU,KAAAsB,IAAA,WACA6S,GAAAJ,QACA3J,EAAAC,KAAA6Z,EAAA,SAAAC,GAEAhQ,EAAAzJ,KACAnQ,KAAA4pB,EAAAlnB,MACA0V,KAAA,UACA4B,MAAA4P,EAAA5P,MACAhG,MAAA,OACAoK,gBAAArP,SAAA,OAAA,OAAA,SAAA,qBAGAtJ,KAAAkJ,IAAA,WAAAiL,IAGAs1B,qBAAA,SAAAM,GACA,GAAA51B,GAAAnU,KAAAsB,IAAA,WACA6S,GAAAJ,QACA3J,EAAAC,KAAA0/B,EAAA,SAAAC,GAEA71B,EAAAzJ,KACAnQ,KAAAyvC,EAAA/sC,MACA0V,KAAA,SACA4B,MAAAy1B,EAAAz1B,MACAhG,MAAA,WAGAvO,KAAAkJ,IAAA,WAAAiL,QCtGApa,EAAA,6CAAA,WA6EA,MA5EA2F,YAAA5B,OAAA8B,QACAG,WAAA,WAIAC,KAAAC,SAAAC,EAAAC,QAAA,WAAA,mBAAAH,KAAAiqC,mBAGAA,iBAAA,SAAAlR,GACAA,EAAA94B,SAAAC,EAAAC,QAAA,UAAA,eAAAH,KAAAkqC,sBAGAA,oBAAA,SAAAzqB,GACA,GAAA0qB,GACAvc,EAAA,UAAAnO,EAAAne,IAAA,OAAA,GASA8I,GAAAC,KAAArK,KAAAupB,WAAA,SAAAhB,EAAA9Z,GACA,GAAArE,EAAAggC,SAAA7hB,GAEAvoB,KAAAkJ,IAAAuF,EAAA8Z,EAAAzsB,QAAA8xB,EAAA,SACA,IAAAxjB,EAAA45B,QAAAzb,GAEAne,EAAAC,KAAAke,EAAA,SAAAlZ,EAAA3R,GACA0M,EAAAggC,SAAA/6B,GAEAiJ,QAAAC,IAAA,kBACAnO,EAAA45B,QAAA30B,GAEAiJ,QAAAC,IAAA,gBACAnO,EAAAigC,SAAAh7B,KAEA86B,EAAA//B,EAAAkgC,UAAAj7B,EAAA,SAAApS,EAAAwR,GAOA,MANArE,GAAAggC,SAAAntC,KACA,GAAAA,EAAAd,QAAAyxB,IACArF,EAAAtsB,OAAAyB,EAAA,GAIAT,IAGA+C,KAAAkJ,IAAAuF,EAAA8Z,KAEAvoB,UACA,IAAAuoB,YAAApf,UAAAK,WAAA,CAEA,GAAA+gC,GAAAhiB,EAAAmG,OAAA,SAAAruB,GAEA,MAAA+J,GAAAogC,MAAAnqC,EAAAkpB,WAAA,SAAAla,GAKA,OAAAjF,EAAAggC,SAAA/6B,KACA,GAAAA,EAAAlT,QAAAyxB,MAQA5tB,MAAAkJ,IAAAuF,EAAA87B,KAEAvqC,WCtEAjG,EAAA,8CAAA,WAqDA,MApDA2F,YAAA5B,OAAA8B,QACAG,WAAA,WAEAC,KAAAC,SAAAC,EAAAC,QAAA,OAAA,uBAAAH,KAAAowB,sBAGAA,oBAAA,SAAAvmB,EAAAgC,EAAA6O,GACA,GAAA,SAAA7Q,EAAAvI,IAAA,cAAA,OAAA,CAEA,IAAA4iB,GAAAlkB,KAAAyqC,UAAA5gC,GAQA6gC,EAAA7+B,EAAAvK,IAAA,gBACAopC,GAAAA,EAAA5uC,QAAA,UAAA,IACA4uC,EAAAA,EAAA5uC,QAAA,IAAA,GACA,IAAA2jB,GAAAvf,EAAAC,QAAA,UAAAkB,QAAA,YAAAqpC,OAEA,KAAAjrB,OACA,KAAArV,EAAAyP,UAAAqK,GAAAjnB,MAAA4O,EAAAvK,IAAA,oBACA4iB,EAAAvnB,MAAA4X,MAAAkL,EAAAne,IAAA,SAAArE,MAAA,UAAAwiB,EAAAne,IAAA,OAAA,MAOAuI,EAAAX,IAAA,UAAAgb,IAIAumB,UAAA,SAAA5gC,GACA,GAAA8gC,IAAA9gC,EAAAvI,IAAA,oBAEA4iB,EAAAhkB,EAAAC,QAAA,UAAAkB,QAAA,iBASA,OARA+I,GAAAC,KAAA6Z,EAAA1Z,OAAA,SAAA2Z,GACA,UAAAA,EAAA7iB,IAAA,SAAA,SAAA6iB,EAAA7iB,IAAA,SAAA,YAAA6iB,EAAA7iB,IAAA,SACAqpC,EAAAhuC,MAAA4X,MAAA4P,EAAA7iB,IAAA,SAAArE,MAAA,UAAAknB,EAAA7iB,IAAA,OAAA,QAIAqpC,EAAAvgC,EAAAwgC,OAAAD,EAAA,SAAAxmB,GAAA,MAAAA,GAAA5P,aC9CAxa,EAAA,oDAAA,WAiCA,MAhCA2F,YAAA5B,OAAA8B,QACAG,WAAA,WAEAC,KAAAC,SAAAC,EAAAC,QAAA,OAAA,uBAAAH,KAAAowB,sBAGAA,oBAAA,SAAAvmB,EAAAgC,EAAA6O,GACA,GAAA,QAAA7Q,EAAAvI,IAAA,cAAA,CACA,GAAAupC,GAAA3qC,EAAAC,QAAA,OAAAkB,QAAA,iBACAypC,EAAA9qC,KAAA+qC,SAAAF,EAAAhhC,EAEAA,GAAAX,IAAA,UAAA4hC,KAIAC,SAAA,SAAAF,EAAAhhC,GACA,GAAAmhC,IAAAnhC,EAAAvI,IAAA,oBAGAwpC,EAAAD,EAAAvpC,IAAA,YAAAA,IAAA,eAQA,OANA8I,GAAAC,KAAAygC,EAAAtgC,OAAA,SAAAmiB,GACAqe,EAAAruC,MAAA4X,MAAAoY,EAAArrB,IAAA,QAAArE,MAAA,SAAA0vB,EAAArrB,IAAA,QAAA,QAGA0pC,EAAA5gC,EAAAwgC,OAAAI,EAAA,SAAAre,GAAA,MAAAA,GAAApY,aC1BAxa,EAAA,6CAAA,WA+BA,MA9BA2F,YAAA5B,OAAA8B,QACAG,WAAA,WAEAC,KAAAC,SAAAC,EAAAC,QAAA,OAAA,uBAAAH,KAAAowB,sBAGAA,oBAAA,SAAAvmB,EAAAgC,EAAA6O,GAEA,GAAA,sBAAA7Q,EAAAvI,IAAA,SAAA8I,EAAA6gC,QAAAp/B,EAAAvK,IAAA,kBAAA,OAAA,GAKA,aAAAuK,EAAAvK,IAAA,uBAAA8I,EAAA6gC,QAAAp/B,EAAAvK,IAAA,2BAKA,GAAAuK,EAAAvK,IAAA,iBAAAnF,QAAA,UACA0P,EAAA3C,IAAA,qBAAA,UACA,GAAA2C,EAAAvK,IAAA,iBAAAnF,QAAA,SACA0P,EAAA3C,IAAA,qBAAA,QAEA2C,EAAA3C,IAAA,qBAAA,eC1BAnP,EAAA,wCAAA,SAAAiwB,GAuDA,MAtDAtqB,YAAA5B,OAAA8B,QACAG,WAAA,WAIAC,KAAAC,SAAAC,EAAAC,QAAA,0BAAA,mBAAAH,KAAAkrC,oBAKAlrC,KAAAC,SAAAC,EAAAC,QAAA,OAAA,uBAAAH,KAAAmrC,kBASAD,mBAAA,SAAAnS,GACAA,EAAA94B,SAAAC,EAAAC,QAAA,SAAA,kBAAAH,KAAAorC,mBAIAC,WAAA,aAEAD,iBAAA,SAAA1e,EAAA4e,GAIA,GAAA,eAAAtrC,KAAAsB,IAAA,sBAAA,CAOA,GAAA+sB,GAAAruB,KAAAsB,IAAA,iBAAAxF,QAAA,SAAAwvC,EAAA,IAAA,SAAA5e,EAAAprB,IAAA,QAAA,IACAtB,MAAAkJ,IAAA,gBAAAmlB,KAGA8c,gBAAA,SAAAthC,EAAAgC,EAAA6O,GAIA,SAAA7O,EAAAvK,IAAA,yBACA,GAAAuK,EAAAvK,IAAA,iBAAAnF,QAAA,YAAA,GAAA0P,EAAAvK,IAAA,iBAAAnF,QAAA,UACA0P,EAAA3C,IAAA,gBAAA,UC5CAnP,EAAA,8BACA,6BAEA,SACA+iC,GAkCA,MAhCAp9B,YAAA5B,OAAA8B,QACAG,WAAA,WAEAC,KAAA8D,WAAA,GAAAg5B,GAAAyO,qBAGArrC,EAAAC,QAAA,YAAAgF,MAAA,WAAAnF,KAAA6nC,QAAA7nC,MACAE,EAAAC,QAAA,YAAAgF,MAAA,qBAAAnF,KAAA8lB,cAAA9lB,OAUA6nC,QAAA,SAAAnpC,GACA,MAAAsB,MAAA8D,WAAAxC,IAAA5C,IASAonB,cAAA,WACA,MAAA9lB,MAAA8D,gBCtCA/J,EAAA,mCAAA,WAuCA,MAtCAoP,UAAAC,MAAAxJ,QACAyJ,UACA4V,WAAA,eACAF,YAAA,GAGAhf,WAAA,WAEAC,KAAAswB,KAAA,SAAAtwB,KAAAqZ,cAAArZ,KAIA,IAAAwE,GAAAtE,EAAAC,QAAA,YAAAkB,QAAA,iBACA+I,GAAAC,KAAA7F,EAAAgG,OAAA,SAAAX,OACA,KAAA7J,KAAAsB,IAAAuI,EAAAvI,IAAA,UACAtB,KAAAkJ,IAAAW,EAAAvI,IAAA,QAAAuI,EAAAvI,IAAA,UAAA2V,QAAA,IAEA/W,EAAAC,QAAA0J,EAAAvI,IAAA,SAAAP,QAAA,iBAAAf,KAAA6J,IACA7J,MAEAA,KAAAC,SAAAC,EAAAC,QAAA,OAAA,sBAAAH,KAAAsf,iBASAjG,cAAA,SAAAhZ,EAAA2M,GACA9M,EAAAC,QAAA,OAAAY,QAAA,iBAAAf,KAAAgN,EAAAnD,eAGAyV,eAAA,SAAAE,EAAA3V,GACA3J,EAAAC,QAAA,OAAAY,QAAA,mBAAAf,KAAAwf,EAAA3V,QCnCA9P,EAAA,6BAAA,iCAAA,SAAAyxC,GAyBA,MAxBA9rC,YAAA5B,OAAA8B,QACAG,WAAA,WAEAC,KAAAK,MAAA,GAAAmrC,GAAAvmB,kBAAA9Q,UAEAjU,EAAAC,QAAA,YAAAgF,MAAA,eAAAnF,KAAAyrC,YAAAzrC,MACAE,EAAAC,QAAA,YAAAgF,MAAA,cAAAnF,KAAAqjB,WAAArjB,MACAE,EAAAC,QAAA,YAAAgF,MAAA,iBAAAnF,KAAA+L,cAAA/L,OAGAyrC,YAAA,WACA,MAAAzrC,MAAAK,OAGA0L,cAAA,SAAAxR,EAAA0C,EAAAga,GACAA,EAAAA,IAAA,EACAjX,KAAAK,MAAA6I,IAAA3O,EAAA0C,GAAAga,OAAAA,KAGAoM,WAAA,SAAA9oB,GACA,MAAAyF,MAAAK,MAAAiB,IAAA/G,QCrBAR,EAAA,qCAAA,gCAAA,SAAAiwB,GAsBA,MArBAtqB,YAAA5B,OAAA8B,QACAG,WAAA,WACAC,KAAA8D,WAAA,GAAAkmB,GAAAxlB,cAAAya,WAAA,aAGA/e,EAAAC,QAAA,YAAAgF,MAAA,mBAAAnF,KAAAklC,gBAAAllC,MAGAE,EAAAC,QAAA,YAAAgF,MAAA,iBAAAnF,KAAAmlC,qBAAAnlC,OAGAklC,gBAAA,SAAA3qC,GACA,MAAAyF,MAAA8D,WAAA+V,WAAAtf,KAAAA,KAGA4qC,qBAAA,WACA,MAAAnlC,MAAA8D,gBCjBA/J,EAAA,qCAAA,WAuBA,MAtBA2F,YAAA5B,OAAA8B,QACAG,WAAA,WAEAG,EAAAC,QAAA,YAAAgF,MAAA,mBAAAnF,KAAAglC,gBAAAhlC,MAEAA,KAAAC,SAAAC,EAAAC,QAAA,uBAAA,qBAAAH,KAAAglC,kBASAA,gBAAA,WACA,GAAAlhC,GAAA5D,EAAAC,QAAA,YAAAkB,QAAA,qBACA+I,GAAAC,KAAAvG,EAAA0G,OAAA,SAAA2Z,GACAA,EAAAjb,IAAA,cAAA,UClBAnP,EAAA,kCAAA,iCAAA,SAAAyxC,GAgBA,MAfA9rC,YAAA5B,OAAA8B,QACAG,WAAA,WACAC,KAAAC,SAAAC,EAAAC,QAAA,YAAA,aAAAH,KAAA0d,YAGAA,UAAA,SAAAlf,EAAAic,GACA,GAAApa,GAAAH,EAAAC,QAAA,YAAAkB,QAAA,eACAnB,GAAAC,QAAA,OAAAkB,QAAA,cAAA,gBAAAhB,MAAAA,EAAAyU,gBAAA2F,EAAAnZ,IAAA,iBAAAmZ,UAAAA,IACAva,EAAAC,QAAA,UAAAkB,QAAA,qBAEAoZ,EAAAvR,IAAA,cAAA,QCTAnP,EAAA,uCAAA,WAiMA,MAhMA2F,YAAA5B,OAAA8B,QACAG,WAAA,WAKAC,KAAAC,SAAAC,EAAAC,QAAA,gCAAA,eAAAH,KAAAg8B,OAIAh8B,KAAAC,SAAAC,EAAAC,QAAA,gCAAA,gBAAAH,KAAA0rC,YAKA1rC,KAAAC,SAAAC,EAAAC,QAAA,gCAAA,cAAAH,KAAA2rC,WAGA3P,MAAA,SAAAx9B,EAAAkuB,GAEA,GAAAzvB,GAAAwC,OAAAjB,EAAAwP,QAAAqB,MAEA3Q,EAAAe,OAAAjB,EAAAwP,QAAA3H,KAAA,KACA,SAAA3H,GAEAsB,KAAA4rC,UAAA3uC,EAAAyvB,GACA1sB,KAAA6rC,QAAAnf,EAAAprB,IAAA,MAAAorB,IACA,MAAAhuB,EAEAsB,KAAA6rC,QAAA5uC,EAAAyvB,GACA,OAAAhuB,GAEAsB,KAAA8rC,SAAA7uC,EAAAyvB,IAIAgf,WAAA,SAAAhf,GACA1sB,KAAA4rC,UAAAlf,EAAAprB,IAAA,QAAAorB,GAAA,GACA1sB,KAAA6rC,QAAAnf,EAAAprB,IAAA,MAAAorB,GACA1sB,KAAA8rC,SAAApf,EAAAprB,IAAA,OAAAorB,GAEAvjB,SAAAwnB,MAAAxwB,QAAA,SAAAY,QAAA,cAAA2rB,IAGAif,SAAA,SAAAjf,EAAA3V,GACA/W,KAAA+rC,cAAAh1B,EAAAjT,aAWA8nC,UAAA,SAAArxC,EAAAmyB,EAAAzV,GACAA,EAAAA,IAAA,CAEA,IAAA2M,GAAA8I,EAAAprB,IAAA,UAEAg+B,EAAA5S,EAAA5oB,WAAAkG,OAAAzP,KAAAkF,OAAA2P,KAAA7U,IAQA,IALAA,GAAAmyB,EAAAprB,IAAA,UACAg+B,MAIA,GAAAA,EAAA5jC,OACAkoB,EAAAooB,WAAA,mEACA,CACA,GAAAV,GAAA5e,EAAAprB,IAAA,OACAorB,GAAAxjB,IAAA,OAAA3O,GAAA0c,OAAAA,IACA/W,EAAAC,QAAA,SAAAY,QAAA,kBAAA2rB,EAAA4e,SACA1nB,GAAAooB,WAGAtf,EAAAxjB,IAAA,SAAA0a,GACA8I,EAAA3rB,QAAA,gBAAA2rB,IAWAmf,QAAA,SAAAI,EAAAvf,GAEA,GAAA9I,GAAA8I,EAAAprB,IAAA,UAMA4qC,GAAA,EACAC,GAAA,EAEArB,EAAAmB,EAAApa,MAAA,GAAAzD,QAAA,iBAOA,IAAA0c,EAAA,CACA,GAAAsB,GAAA1f,EAAA5oB,UAEAgnC,GAAAA,EAAAxvC,IAAA,SAAAqxB,GAEA,GAAApyB,GAAAoyB,EAAA7wB,QAAA,IAAA,IAAAA,QAAA,SAAA,IAEAuwC,EAAAD,EAAAvyB,WAAAtf,KAAAA,GACAA,IAAAmyB,EAAAprB,IAAA,SAEAsiB,EAAA0oB,QAAA,wCACAJ,GAAA,GACAG,GAAAA,EAAA/qC,IAAA,SAAAorB,EAAAprB,IAAA,WAEA6qC,GAAA,EACAvoB,EAAA2oB,WAAA,2CAMAL,SACAtoB,GAAA0oB,QAIAH,SACAvoB,GAAA2oB,WAIA7f,EAAAxjB,IAAA,SAAA0a,GACA8I,EAAA3rB,QAAA,gBAAA2rB,IAYAof,SAAA,SAAAU,EAAA9f,GAEA,OAAA,KAAA,EAAA,OAAA,CAEA,IAAA9I,GAAA8I,EAAAprB,IAAA,UAKAmrC,GAAA,EAGAC,EAAAC,KAAAC,IAAAltB,SAAA8sB,EAAAp9B,QACA,MAAAo9B,EAAAp9B,QAAAs9B,EAAAllB,aAAAglB,EAAAp9B,SACAq9B,GAAA,EACA7oB,EAAAipB,UAAA,4CAIAJ,SACA7oB,GAAAipB,UAIAngB,EAAAxjB,IAAA,SAAA0a,GACA8I,EAAA3rB,QAAA,gBAAA2rB,IAIAqf,cAAA,SAAAjoC,GACA,GAAA1B,GAAApC,IACA8D,GAAA0G,OAAAlP,IAAA,SAAAgmC,GACAl/B,EAAAwpC,UAAAtK,EAAAhgC,IAAA,QAAAggC,GACAl/B,EAAAypC,QAAAvK,EAAAhgC,IAAA,MAAAggC,GACAl/B,EAAA0pC,SAAAxK,EAAAhgC,IAAA,OAAAggC,UC7LAvnC,EACA,+BAIA,yBACA,yBACA,+BACA,+BACA,uBACA,2CACA,2BACA,2BACA,8BACA,8BACA,+BACA,8BACA,kCACA,+BACA,4BACA,0BACA,6BACA,2BACA,iCACA,sCACA,uCACA,2BACA,gCACA,+BACA,4BACA,8BACA,kCACA,iCACA,sBACA,qCACA,mCACA,8BACA,+BACA,6BACA,yBACA,0BACA,8BACA,qCACA,2CACA,sCACA,+BACA,gCACA,+CACA,+BAIA,2BACA,mCACA,iCACA,6BACA,qCACA,iCACA,8BACA,0BACA,iCACA,gCACA,mCACA,qCACA,+BACA,mCACA,mCACA,mCACA,yBACA,6BACA,4BACA,iCACA,qCACA,sCAKA,4BACA,2BACA,qCACA,iCACA,uCACA,qCACA,+BACA,gCACA,kCACA,qCACA,0CACA,2CACA,iDACA,0CACA,qCAKA,6BACA,4BACA,oCACA,kCACA,iCACA,qCAEA,SAIA+yC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EAIAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GAIAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GAKAC,GACAC,GACAC,GACAC,GACAC,GACAC,IAqHA,MAlHA1yC,YAAA5B,OAAA8B,QACAG,WAAA,WAIA,GAAAovC,GACA,GAAAC,GACA,GAAAvB,GACA,GAAAf,GACA,GAAAC,GACA,GAAAC,GACA,GAAAC,GACA,GAAAE,GACA,GAAAG,GACA,GAAAC,GACA,GAAAC,GACA,GAAAC,GACA,GAAAC,GACA,GAAAC,GACA,GAAAG,GACA,GAAAC,GACA,GAAAC,GACA,GAAAK,GACA,GAAAI,GACA,GAAAC,GACA,GAAAC,GACA,GAAAC,GACA,GAAAC,GACA,GAAAC,GACA,GAAAW,GACA,GAAAV,GACA,GAAAC,GACA,GAAAC,GACA,GAAAC,GACA,GAAA9B,GACA,GAAAiC,GACA,GAAAC,GACA,GAAAC,GACA,GAAAC,GAQA,GAAArB,GACA,GAAA+B,GAEA,GAAAR,GACA,GAAAC,GACA,GAAAC,GACA,GAAAC,GACA,GAAAC,GACA,GAAAC,GACA,GAAAC,GACA,GAAA9B,GACA,GAAAE,GACA,GAAAH,GACA,GAAAkC,GACA,GAAAC,IACA,GAAAC,IACA,GAAAC,IACA,GAAAC,IACA,GAAAC,IACA,GAAAC,IACA,GAAAC,IACA,GAAAC,IACA,GAAAC,IACA,GAAAC,IACA,GAAAC,IACA,GAAAC,IAIA,GAAAU,IACA,GAAAC,IACA,GAAAE,IACA,GAAAE,IACA,GAAAd,IACA,GAAAC,IACA,GAAAC,IACA,GAAAC,IACA,GAAAC,IACA,GAAAC,IACA,GAAAC,IACA,GAAAC,IACA,GAAAC,IACA,GAAAG,IACA,GAAAE,IAKA,GAAAE,IACA,GAAAE,IACA,GAAAG,IACA,GAAAJ,IACA,GAAAE,IACA,GAAAC,IAMA,GAAAjF,GACA,GAAA+C,GACA,GAAA5C,GACA,GAAAiB,GACA,GAAAC,GACA,GAAAC,QAOAz0C,EAAA,0BAAA,0BAAA,SAAAgkB,GCjLA,MA1JAre,YAAA6D,WAAA3D,QACAC,QAAA,MACAC,SAAA,8BACAuyC,eAAA,EAEA7uC,SACAwa,aAAA,qBAGAje,WAAA,WACAC,KAAAK,MAAAC,GAAA,oBAAAN,KAAAI,OAAAJ,MACAA,KAAAK,MAAAC,GAAA,eAAAN,KAAAI,OAAAJ,MACAA,KAAAK,MAAAC,GAAA,kBAAAN,KAAAI,OAAAJ,MACAA,KAAAK,MAAAC,GAAA,YAAAN,KAAAI,OAAAJ,OAGAiG,gBAAA,WACAjG,KAAAK,MAAA6F,IAAA,oBAAAlG,KAAAI,QACAJ,KAAAK,MAAA6F,IAAA,eAAAlG,KAAAI,QACAJ,KAAAK,MAAA6F,IAAA,kBAAAlG,KAAAI,QACAJ,KAAAK,MAAA6F,IAAA,YAAAlG,KAAAI,SAGAG,SAAA,WACAP,KAAAQ,IAAAR,KAAAQ,IAAAC,WACAT,KAAAQ,IAAAE,SACAV,KAAAW,WAAAX,KAAAQ,KAEAR,KAAAge,aAAAna,KAAA,GAAAka,IAAA1d,MAAAL,KAAAK,SACAZ,OAAAO,KAAAiC,IAAAgQ,mBAEA/R,EAAAC,QAAA,OAAAkB,QAAA,cACA5B,OAAAO,KAAAiC,IAAA3B,GAAA,UAAA,SAAA9B,EAAA8zC,GACA7yC,OAAAjB,EAAAwP,QAAAyjB,SAAA,sBACAhyB,OAAAO,MAAAoM,SAAA,oCACA3M,OAAAO,MAAA2mC,aAAA,SAAAC,SAAA,MAAA,IAAA,MAAA,IAAA,OAAA,KAAA,OAAA,KAAAC,MAAA,SAMA7lC,gBAAA,WACA,OACAG,cAAA,WACA,GAAAC,GAAA,eAIA,OAHApB,MAAA+e,aACA3d,GAAA,WAEAA,GAEAmxC,eAAA,WACA,MAAA,IAAAvyC,KAAAwyC,SACA,kCAEA,IAGAC,WAAA,WACA,MAAAhzC,QAAAulB,UAAAhlB,KAAAtB,IACA,SAAAsB,KAAAtB,GAEAsB,KAAAtB,IAGAg0C,WAAA,WAEA,MAAA,sBADAxyC,EAAAC,QAAA,UAAAkB,QAAA,WAAArB,KAAA2S,MACArR,IAAA,QAAA,eAKAV,QACAyc,6BAAA,uBACAs1B,UAAA,gBACAx0B,MAAA,iBACAy0B,UAAA,eACAC,UAAA,YACAC,WAAA,aACAC,OAAA,UAGA30B,eAAA,SAAA5f,GACA,GAAAwB,KAAAqyC,cAEA,MADAryC,MAAAqyC,eAAA,GACA,GAGA5yC,OAAAjB,EAAAwP,QAAAlI,SAAA2rB,SAAA,uBAAAhyB,OAAAjB,EAAAwP,QAAAlI,SAAA2rB,SAAA,kBAAAhyB,OAAAjB,EAAAwP,QAAAyjB,SAAA,oBAAAvxB,EAAAC,QAAA,OAAAkB,QAAA,eACA5B,OAAA,UAAA6P,OACApP,EAAAC,QAAA,OAAAY,QAAA,aAAAvC,EAAAwB,KAAAK,SAIA2yC,cAAA,SAAAx0C,GACA,GAAAgQ,GAAAtO,EAAAC,QAAA,OAAAkB,QAAA,cAIA,QAAA,GAAAmN,EAAArS,QAAA,OAMA,GAAAqS,EAAArS,QAAA,KACA+D,EAAAC,QAAA,OAAAY,QAAA,eAAAvC,EAAAwB,KAAAK,OACAL,KAAAqyC,eAAA;uBACA,IACA,GAAA7jC,EAAArS,QAAA,KACA6D,KAAAqyC,eAAA,EACAnyC,EAAAC,QAAA,OAAAY,QAAA,kBAAAvC,EAAAwB,KAAAK,QACA,OAHA,KAOA4yC,aAAA,SAAAz0C,GACAiB,OAAAjB,EAAAwP,QAAAlI,SAAA2rB,SAAA,uBACAvxB,EAAAC,QAAA,OAAAY,QAAA,aAAAvC,EAAAwB,KAAAK,QAIA6yC,UAAA,SAAA10C,EAAA8zC,GACA7yC,OAAA6yC,EAAAa,UAAAnlC,QAAA0iB,QAAA,OAAAxuB,KAAA,sBAAA2B,OACApE,OAAA6yC,EAAAa,UAAAnlC,QAAA0iB,QAAA,OAAAxuB,KAAA,mBAAA2B,QAGAuvC,WAAA,SAAA50C,EAAA8zC,GACA7yC,OAAA6yC,EAAAa,UAAAnlC,QAAA0iB,QAAA,OAAAxuB,KAAA,sBAAA4Z,OACArc,OAAA6yC,EAAAa,UAAAnlC,QAAA0iB,QAAA,OAAAxuB,KAAA,mBAAA4Z,QAGAi3B,OAAA,SAAAv0C,EAAA8zC,GACA7yC,OAAAO,KAAAiC,IAAA0kC,aAAA,QACAlnC,OAAAO,KAAAiC,IAAAyL,YAAA,qCAGApD,OAAA,WACApK,EAAAC,QAAA,UAAAkB,QAAA,gBACArB,KAAAQ,IAAAsb,KAAA,OAAA,WACArc,OAAAO,MAAAsK,WAGAtK,KAAAQ,IAAA8J,SAGApK,EAAAC,QAAA,UAAAkB,QAAA,gBAAA,IAGAyc,qBAAA,SAAAtf,GACAiB,OAAAO,KAAAiC,IAAAC,KAAA,oBAAA8E,IAAA,UAAA,SAOAjN,EAAA,mCAAA,WC9GA,MA9CA2F,YAAAC,SAAAC,QACAC,QAAA,MACAC,SAAA,qCAEAmG,gBAAA,WACAxG,OAAAO,KAAAiC,IAAA6D,SAAA4H,YAAA,6BAAAgR,UAAA,YAGAne,SAAA,WACAP,KAAAQ,IAAAR,KAAAQ,IAAAC,WACAT,KAAAQ,IAAAE,SACAV,KAAAW,WAAAX,KAAAQ,MAGAwB,OAAA,WACAvC,OAAAO,KAAAiC,IAAA6D,SAAA2rB,SAAA,gBACAhyB,OAAAO,KAAAiC,IAAA6D,SAAAuK,SAAA,WAEA5Q,OAAAO,KAAAiC,IAAA6D,SAAAsG,SAAA,6BACA3M,OAAAO,KAAAiC,IAAA6D,SAAA4Y,WACAC,OAAA,SAAA3N,GACA,GAAAvR,OAAAuR,GAAAygB,SAAA,aAAAhyB,OAAAuR,GAAAygB,SAAA,wBACA,OAAA,GAGAthB,YAAA,sBACAyO,WAAA,qBACApO,UAAA,UACAC,KAAA,SAAAjS,EAAAkS,GACAA,EAAAkL,KAAAlL,EAAAM,UACA9Q,EAAAC,QAAA,OAAAkB,QAAA,sBAAAqP,IAEAC,IAAA,SAAAnS,EAAAkS,GACAA,EAAAkL,KAAAlL,EAAAM,UACA9Q,EAAAC,QAAA,OAAAkB,QAAA,qBAAAqP,IAEAmO,KAAA,SAAArgB,EAAAkS,GACAA,EAAAkL,KAAAlL,EAAAM,UACA9Q,EAAAC,QAAA,OAAAkB,QAAA,yBAAAqP,EACA,IAAAzH,GAAA/I,EAAAC,QAAA,UAAAkB,QAAA,iBACA4H,GAAAlI,QAAA,QAAAkI,WCjCAlP,EAAA,yBAAA,WA4BA,MA3BA2F,YAAAC,SAAAC,QACAC,QAAA,MACAC,SAAA,6BAEAC,WAAA,WAEAC,KAAAK,MAAAC,GAAA,eAAAN,KAAAI,OAAAJ,OASAgB,gBAAA,WAEA,OACAqyC,YAAA,WACA,GAAA9uC,GAAArE,EAAAC,QAAA,OAAAkB,QAAA,gBACA,OAAA+I,GAAA+M,OAAA5S,EAAAjD,IAAA,YAAAA,IAAA,iBCpBAvH,EAAA,mBAAA,yBAAA,gCAAA,uBAAA,SAAAu5C,EAAAC,EAAAC,GA2BA,MA1BA9zC,YAAA5B,OAAA8B,QACAG,WAAA,WAEAG,EAAAC,QAAA,SAAAgF,MAAA,gBAAAnF,KAAAyzC,cAGAvzC,EAAAC,QAAA,SAAAgF,MAAA,uBAAAnF,KAAA0zC,qBAGAxzC,EAAAC,QAAA,SAAAgF,MAAA,gBAAAnF,KAAA2zC,eAGAF,aAAA,SAAApzC,GACA,MAAAizC,IAGAI,oBAAA,WACA,MAAAH,IAGAI,aAAA,WACA,MAAAH,OAOA,IAAAtzC,GAAAiJ,SAAAwnB,KCpCAlxB,QAAAsoB,UAAA6rB,MAAA,SAAAC,GACA/5C,GAAA,oBAAA,8BAAA,mBAAA,SAAAg6C,EAAAC,EAAAC,IAmDA,IAjDAt0C,WAAAu0C,YAAAr0C,QAEAG,WAAA,SAAAiN,GAEA,GAAA5K,GAAApC,IACAN,YAAAw0C,SAAA9zC,OAAA,SAAAN,EAAAuG,GACA,GAAAvG,GAAAsC,EAAAtC,SAAAA,EACA,OAAAA,GAAAuG,IAIAnG,EAAAC,QAAA,OAAAY,QAAA,yBAAAf,KAEA,IAAA+zC,EAEA7zC,GAAAC,QAAA,OAAAY,QAAA,wBAAAf,MAGAE,EAAAC,QAAA,OAAAY,QAAA,mBAAAf,KACA,IAAAg0C,EAEA9zC,GAAAC,QAAA,OAAAY,QAAA,kBAAAf,MAEAE,EAAAC,QAAA,OAAAgF,MAAA,eAAAnF,KAAAF,WAGAq0C,QAAA,WACA,GAAAL,EAEA5zC,GAAAC,QAAA,OAAAY,QAAA,iBAAAf,MAKA,GAAAyM,QAAA06B,QACAjnC,EAAAC,QAAA,OAAAkB,QAAA,cAAA,aAIAvB,SAAA,SAAAA,GACA,MAAAsK,GAAAtK,SAAA+zC,EAAA/zC,GAAA2S,QACA2hC,SAAA,kBACAC,YAAA,0BACAl9B,OAAA,2BACAm9B,SAAA,cAMAxjC,YAGA/W,EAAA,OAAA","file":"builder.js","sourcesContent":["(function () {\n","/**\r\n * @license almond 0.3.1 Copyright (c) 2011-2014, The Dojo Foundation All Rights Reserved.\r\n * Available via the MIT or new BSD license.\r\n * see: http://github.com/jrburke/almond for details\r\n */\r\n//Going sloppy to avoid 'use strict' string cost, but strict practices should\r\n//be followed.\r\n/*jslint sloppy: true */\r\n/*global setTimeout: false */\r\n\r\nvar requirejs, require, define;\r\n(function (undef) {\r\n    var main, req, makeMap, handlers,\r\n        defined = {},\r\n        waiting = {},\r\n        config = {},\r\n        defining = {},\r\n        hasOwn = Object.prototype.hasOwnProperty,\r\n        aps = [].slice,\r\n        jsSuffixRegExp = /\\.js$/;\r\n\r\n    function hasProp(obj, prop) {\r\n        return hasOwn.call(obj, prop);\r\n    }\r\n\r\n    /**\r\n     * Given a relative module name, like ./something, normalize it to\r\n     * a real name that can be mapped to a path.\r\n     * @param {String} name the relative name\r\n     * @param {String} baseName a real name that the name arg is relative\r\n     * to.\r\n     * @returns {String} normalized name\r\n     */\r\n    function normalize(name, baseName) {\r\n        var nameParts, nameSegment, mapValue, foundMap, lastIndex,\r\n            foundI, foundStarMap, starI, i, j, part,\r\n            baseParts = baseName && baseName.split(\"/\"),\r\n            map = config.map,\r\n            starMap = (map && map['*']) || {};\r\n\r\n        //Adjust any relative paths.\r\n        if (name && name.charAt(0) === \".\") {\r\n            //If have a base name, try to normalize against it,\r\n            //otherwise, assume it is a top-level require that will\r\n            //be relative to baseUrl in the end.\r\n            if (baseName) {\r\n                name = name.split('/');\r\n                lastIndex = name.length - 1;\r\n\r\n                // Node .js allowance:\r\n                if (config.nodeIdCompat && jsSuffixRegExp.test(name[lastIndex])) {\r\n                    name[lastIndex] = name[lastIndex].replace(jsSuffixRegExp, '');\r\n                }\r\n\r\n                //Lop off the last part of baseParts, so that . matches the\r\n                //\"directory\" and not name of the baseName's module. For instance,\r\n                //baseName of \"one/two/three\", maps to \"one/two/three.js\", but we\r\n                //want the directory, \"one/two\" for this normalization.\r\n                name = baseParts.slice(0, baseParts.length - 1).concat(name);\r\n\r\n                //start trimDots\r\n                for (i = 0; i < name.length; i += 1) {\r\n                    part = name[i];\r\n                    if (part === \".\") {\r\n                        name.splice(i, 1);\r\n                        i -= 1;\r\n                    } else if (part === \"..\") {\r\n                        if (i === 1 && (name[2] === '..' || name[0] === '..')) {\r\n                            //End of the line. Keep at least one non-dot\r\n                            //path segment at the front so it can be mapped\r\n                            //correctly to disk. Otherwise, there is likely\r\n                            //no path mapping for a path starting with '..'.\r\n                            //This can still fail, but catches the most reasonable\r\n                            //uses of ..\r\n                            break;\r\n                        } else if (i > 0) {\r\n                            name.splice(i - 1, 2);\r\n                            i -= 2;\r\n                        }\r\n                    }\r\n                }\r\n                //end trimDots\r\n\r\n                name = name.join(\"/\");\r\n            } else if (name.indexOf('./') === 0) {\r\n                // No baseName, so this is ID is resolved relative\r\n                // to baseUrl, pull off the leading dot.\r\n                name = name.substring(2);\r\n            }\r\n        }\r\n\r\n        //Apply map config if available.\r\n        if ((baseParts || starMap) && map) {\r\n            nameParts = name.split('/');\r\n\r\n            for (i = nameParts.length; i > 0; i -= 1) {\r\n                nameSegment = nameParts.slice(0, i).join(\"/\");\r\n\r\n                if (baseParts) {\r\n                    //Find the longest baseName segment match in the config.\r\n                    //So, do joins on the biggest to smallest lengths of baseParts.\r\n                    for (j = baseParts.length; j > 0; j -= 1) {\r\n                        mapValue = map[baseParts.slice(0, j).join('/')];\r\n\r\n                        //baseName segment has  config, find if it has one for\r\n                        //this name.\r\n                        if (mapValue) {\r\n                            mapValue = mapValue[nameSegment];\r\n                            if (mapValue) {\r\n                                //Match, update name to the new value.\r\n                                foundMap = mapValue;\r\n                                foundI = i;\r\n                                break;\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n\r\n                if (foundMap) {\r\n                    break;\r\n                }\r\n\r\n                //Check for a star map match, but just hold on to it,\r\n                //if there is a shorter segment match later in a matching\r\n                //config, then favor over this star map.\r\n                if (!foundStarMap && starMap && starMap[nameSegment]) {\r\n                    foundStarMap = starMap[nameSegment];\r\n                    starI = i;\r\n                }\r\n            }\r\n\r\n            if (!foundMap && foundStarMap) {\r\n                foundMap = foundStarMap;\r\n                foundI = starI;\r\n            }\r\n\r\n            if (foundMap) {\r\n                nameParts.splice(0, foundI, foundMap);\r\n                name = nameParts.join('/');\r\n            }\r\n        }\r\n\r\n        return name;\r\n    }\r\n\r\n    function makeRequire(relName, forceSync) {\r\n        return function () {\r\n            //A version of a require function that passes a moduleName\r\n            //value for items that may need to\r\n            //look up paths relative to the moduleName\r\n            var args = aps.call(arguments, 0);\r\n\r\n            //If first arg is not require('string'), and there is only\r\n            //one arg, it is the array form without a callback. Insert\r\n            //a null so that the following concat is correct.\r\n            if (typeof args[0] !== 'string' && args.length === 1) {\r\n                args.push(null);\r\n            }\r\n            return req.apply(undef, args.concat([relName, forceSync]));\r\n        };\r\n    }\r\n\r\n    function makeNormalize(relName) {\r\n        return function (name) {\r\n            return normalize(name, relName);\r\n        };\r\n    }\r\n\r\n    function makeLoad(depName) {\r\n        return function (value) {\r\n            defined[depName] = value;\r\n        };\r\n    }\r\n\r\n    function callDep(name) {\r\n        if (hasProp(waiting, name)) {\r\n            var args = waiting[name];\r\n            delete waiting[name];\r\n            defining[name] = true;\r\n            main.apply(undef, args);\r\n        }\r\n\r\n        if (!hasProp(defined, name) && !hasProp(defining, name)) {\r\n            throw new Error('No ' + name);\r\n        }\r\n        return defined[name];\r\n    }\r\n\r\n    //Turns a plugin!resource to [plugin, resource]\r\n    //with the plugin being undefined if the name\r\n    //did not have a plugin prefix.\r\n    function splitPrefix(name) {\r\n        var prefix,\r\n            index = name ? name.indexOf('!') : -1;\r\n        if (index > -1) {\r\n            prefix = name.substring(0, index);\r\n            name = name.substring(index + 1, name.length);\r\n        }\r\n        return [prefix, name];\r\n    }\r\n\r\n    /**\r\n     * Makes a name map, normalizing the name, and using a plugin\r\n     * for normalization if necessary. Grabs a ref to plugin\r\n     * too, as an optimization.\r\n     */\r\n    makeMap = function (name, relName) {\r\n        var plugin,\r\n            parts = splitPrefix(name),\r\n            prefix = parts[0];\r\n\r\n        name = parts[1];\r\n\r\n        if (prefix) {\r\n            prefix = normalize(prefix, relName);\r\n            plugin = callDep(prefix);\r\n        }\r\n\r\n        //Normalize according\r\n        if (prefix) {\r\n            if (plugin && plugin.normalize) {\r\n                name = plugin.normalize(name, makeNormalize(relName));\r\n            } else {\r\n                name = normalize(name, relName);\r\n            }\r\n        } else {\r\n            name = normalize(name, relName);\r\n            parts = splitPrefix(name);\r\n            prefix = parts[0];\r\n            name = parts[1];\r\n            if (prefix) {\r\n                plugin = callDep(prefix);\r\n            }\r\n        }\r\n\r\n        //Using ridiculous property names for space reasons\r\n        return {\r\n            f: prefix ? prefix + '!' + name : name, //fullName\r\n            n: name,\r\n            pr: prefix,\r\n            p: plugin\r\n        };\r\n    };\r\n\r\n    function makeConfig(name) {\r\n        return function () {\r\n            return (config && config.config && config.config[name]) || {};\r\n        };\r\n    }\r\n\r\n    handlers = {\r\n        require: function (name) {\r\n            return makeRequire(name);\r\n        },\r\n        exports: function (name) {\r\n            var e = defined[name];\r\n            if (typeof e !== 'undefined') {\r\n                return e;\r\n            } else {\r\n                return (defined[name] = {});\r\n            }\r\n        },\r\n        module: function (name) {\r\n            return {\r\n                id: name,\r\n                uri: '',\r\n                exports: defined[name],\r\n                config: makeConfig(name)\r\n            };\r\n        }\r\n    };\r\n\r\n    main = function (name, deps, callback, relName) {\r\n        var cjsModule, depName, ret, map, i,\r\n            args = [],\r\n            callbackType = typeof callback,\r\n            usingExports;\r\n\r\n        //Use name if no relName\r\n        relName = relName || name;\r\n\r\n        //Call the callback to define the module, if necessary.\r\n        if (callbackType === 'undefined' || callbackType === 'function') {\r\n            //Pull out the defined dependencies and pass the ordered\r\n            //values to the callback.\r\n            //Default to [require, exports, module] if no deps\r\n            deps = !deps.length && callback.length ? ['require', 'exports', 'module'] : deps;\r\n            for (i = 0; i < deps.length; i += 1) {\r\n                map = makeMap(deps[i], relName);\r\n                depName = map.f;\r\n\r\n                //Fast path CommonJS standard dependencies.\r\n                if (depName === \"require\") {\r\n                    args[i] = handlers.require(name);\r\n                } else if (depName === \"exports\") {\r\n                    //CommonJS module spec 1.1\r\n                    args[i] = handlers.exports(name);\r\n                    usingExports = true;\r\n                } else if (depName === \"module\") {\r\n                    //CommonJS module spec 1.1\r\n                    cjsModule = args[i] = handlers.module(name);\r\n                } else if (hasProp(defined, depName) ||\r\n                           hasProp(waiting, depName) ||\r\n                           hasProp(defining, depName)) {\r\n                    args[i] = callDep(depName);\r\n                } else if (map.p) {\r\n                    map.p.load(map.n, makeRequire(relName, true), makeLoad(depName), {});\r\n                    args[i] = defined[depName];\r\n                } else {\r\n                    throw new Error(name + ' missing ' + depName);\r\n                }\r\n            }\r\n\r\n            ret = callback ? callback.apply(defined[name], args) : undefined;\r\n\r\n            if (name) {\r\n                //If setting exports via \"module\" is in play,\r\n                //favor that over return value and exports. After that,\r\n                //favor a non-undefined return value over exports use.\r\n                if (cjsModule && cjsModule.exports !== undef &&\r\n                        cjsModule.exports !== defined[name]) {\r\n                    defined[name] = cjsModule.exports;\r\n                } else if (ret !== undef || !usingExports) {\r\n                    //Use the return value from the function.\r\n                    defined[name] = ret;\r\n                }\r\n            }\r\n        } else if (name) {\r\n            //May just be an object definition for the module. Only\r\n            //worry about defining if have a module name.\r\n            defined[name] = callback;\r\n        }\r\n    };\r\n\r\n    requirejs = require = req = function (deps, callback, relName, forceSync, alt) {\r\n        if (typeof deps === \"string\") {\r\n            if (handlers[deps]) {\r\n                //callback in this case is really relName\r\n                return handlers[deps](callback);\r\n            }\r\n            //Just return the module wanted. In this scenario, the\r\n            //deps arg is the module name, and second arg (if passed)\r\n            //is just the relName.\r\n            //Normalize module name, if it contains . or ..\r\n            return callDep(makeMap(deps, callback).f);\r\n        } else if (!deps.splice) {\r\n            //deps is a config object, not an array.\r\n            config = deps;\r\n            if (config.deps) {\r\n                req(config.deps, config.callback);\r\n            }\r\n            if (!callback) {\r\n                return;\r\n            }\r\n\r\n            if (callback.splice) {\r\n                //callback is an array, which means it is a dependency list.\r\n                //Adjust args if there are dependencies\r\n                deps = callback;\r\n                callback = relName;\r\n                relName = null;\r\n            } else {\r\n                deps = undef;\r\n            }\r\n        }\r\n\r\n        //Support require(['a'])\r\n        callback = callback || function () {};\r\n\r\n        //If relName is a function, it is an errback handler,\r\n        //so remove it.\r\n        if (typeof relName === 'function') {\r\n            relName = forceSync;\r\n            forceSync = alt;\r\n        }\r\n\r\n        //Simulate async callback;\r\n        if (forceSync) {\r\n            main(undef, deps, callback, relName);\r\n        } else {\r\n            //Using a non-zero value because of concern for what old browsers\r\n            //do, and latest browsers \"upgrade\" to 4 if lower value is used:\r\n            //http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#dom-windowtimers-settimeout:\r\n            //If want a value immediately, use require('id') instead -- something\r\n            //that works in almond on the global level, but not guaranteed and\r\n            //unlikely to work in other AMD implementations.\r\n            setTimeout(function () {\r\n                main(undef, deps, callback, relName);\r\n            }, 4);\r\n        }\r\n\r\n        return req;\r\n    };\r\n\r\n    /**\r\n     * Just drops the config on the floor, but returns req in case\r\n     * the config return value is used.\r\n     */\r\n    req.config = function (cfg) {\r\n        return req(cfg);\r\n    };\r\n\r\n    /**\r\n     * Expose module registry for debugging and tooling\r\n     */\r\n    requirejs._defined = defined;\r\n\r\n    define = function (name, deps, callback) {\r\n        if (typeof name !== 'string') {\r\n            throw new Error('See almond README: incorrect module build, no module name');\r\n        }\r\n\r\n        //This module may not have dependencies\r\n        if (!deps.splice) {\r\n            //deps is not an array, so probably means\r\n            //an object literal or factory function for\r\n            //the value. Adjust args.\r\n            callback = deps;\r\n            deps = [];\r\n        }\r\n\r\n        if (!hasProp(defined, name) && !hasProp(waiting, name)) {\r\n            waiting[name] = [name, deps, callback];\r\n        }\r\n    };\r\n\r\n    define.amd = {\r\n        jQuery: true\r\n    };\r\n}());\r\n\ndefine(\"../lib/almond\", function(){});\n\n","/**\r\n * Renders an application menu item from a domain model.\r\n *\r\n * @package Ninja Forms builder\r\n * @subpackage App\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'views/app/menuItem',[], function() {\r\n\tvar view = Marionette.ItemView.extend({\r\n\t\ttagName: 'div',\r\n\t\ttemplate: '#tmpl-nf-app-menu-item',\r\n\r\n\t\tinitialize: function() {\r\n\t\t\t// Listen for domain changes and re-render when we detect one.\r\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'change:currentDomain', this.render );\r\n\t\t\t// When we change the model (to disable it, for example), re-render.\r\n\t\t\tthis.model.on( 'change', this.render, this );\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * When we render this view, remove the extra <div> tag created by backbone.\r\n\t\t * \r\n\t\t * @since  3.0\r\n\t\t * @return void\r\n\t\t */\r\n\t\tonRender: function() {\r\n\t\t\tthis.$el = this.$el.children();\r\n\t\t\tthis.$el.unwrap();\r\n\t\t\tthis.setElement( this.$el );\r\n\t\t},\r\n\r\n\t\t// Listen for clicks on our app menu.\r\n\t\tevents: {\r\n\t\t\t'click a': 'clickAppMenu'\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * When we click on a menu item, fire a radio event.\r\n\t\t * This lets us separate the logic from the click event and view.\r\n\t\t * We pass this.model so that we know what item was clicked.\r\n\t\t * \r\n\t\t * @since  3.0\r\n\t\t * @param  Object\te event\r\n\t\t * @return return\r\n\t\t */\r\n\t\tclickAppMenu: function( e ) {\r\n\t\t\tnfRadio.channel( 'app' ).trigger( 'click:menu', e, this.model );\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * These functions are available to templates, and help us to remove logic from template files.\r\n\t\t * \r\n\t\t * @since  3.0\r\n\t\t * @return Object\r\n\t\t */\r\n\t\ttemplateHelpers: function() {\r\n\t\t\treturn {\r\n\t\t\t\t/**\r\n\t\t\t\t * If we have any dashicons in our model, render them.\r\n\t\t\t\t * \r\n\t\t\t\t * @since  3.0\r\n\t\t\t\t * @return string\r\n\t\t\t\t */\r\n\t\t\t\trenderDashicons: function() {\r\n\t\t\t\t\tif ( this.dashicons ) {\r\n\t\t\t\t\t\treturn '<span class=\"dashicons ' + this.dashicons + '\"></span>'\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\treturn '';\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\t/**\r\n\t\t\t\t * Render classes for our menu item, including active.\r\n\t\t\t\t * \r\n\t\t\t\t * @since  3.0\r\n\t\t\t\t * @return string\r\n\t\t\t\t */\r\n\t\t\t\trenderClasses: function() {\r\n\t\t\t\t\tvar classes = this.classes;\r\n\t\t\t\t\tvar currentDomain = nfRadio.channel( 'app' ).request( 'get:currentDomain' );\r\n\t\t\t\t\tif ( currentDomain.get( 'id' ) == this.id ) {\r\n\t\t\t\t\t\tclasses += ' active';\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn classes;\r\n\t\t\t\t},\r\n\t\t\t\t/**\r\n\t\t\t\t * If our menu is a link (like preview), render its url.\r\n\t\t\t\t * \r\n\t\t\t\t * @since  3.0\r\n\t\t\t\t * @return string\r\n\t\t\t\t */\r\n\t\t\t\trenderUrl: function() {\r\n\t\t\t\t\tif ( '' != this.url ) {\r\n\t\t\t\t\t\tvar formModel = nfRadio.channel( 'app' ).request( 'get:formModel' );\r\n\t\t\t\t\t\treturn this.url + formModel.get( 'id' );\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\treturn '#';\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\t/**\r\n\t\t\t\t * If our menu is a link (like preview), render its target.\r\n\t\t\t\t * \r\n\t\t\t\t * @since  3.0\r\n\t\t\t\t * @return string\r\n\t\t\t\t */\r\n\t\t\t\trenderTarget: function() {\r\n\t\t\t\t\tif ( '' != this.url ) {\r\n\t\t\t\t\t\treturn '_blank';\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\treturn '_self';\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\r\n\t\t\t\t/**\r\n\t\t\t\t * If our menu item is disabled, output 'disabled'\r\n\t\t\t\t * \r\n\t\t\t\t * @since  3.0\r\n\t\t\t\t * @return string\r\n\t\t\t\t */\r\n\t\t\t\trenderDisabled: function() {\r\n\t\t\t\t\tif ( this.disabled ) {\r\n\t\t\t\t\t\treturn 'disabled';\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\treturn '';\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t});\r\n\r\n\treturn view;\r\n} );\n","/**\r\n * Collection view that takes our app menu items and renders an individual view for each.\r\n *\r\n * @package Ninja Forms builder\r\n * @subpackage App\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'views/app/menu',['views/app/menuItem'], function( appMenuItemView ) {\r\n\tvar view = Marionette.CollectionView.extend( {\r\n\t\ttagName: 'div',\r\n\t\tchildView: appMenuItemView,\r\n\r\n\t\t/**\r\n\t\t * When we show this view, get rid of the extra <div> tag added by backbone.\r\n\t\t * \r\n\t\t * @since  3.0\r\n\t\t * @return void\r\n\t\t */\r\n\t\tonShow: function() {\r\n\t\t\tjQuery( this.el ).find( 'li:last' ).unwrap();\r\n\t\t}\r\n\t} );\r\n\r\n\treturn view;\r\n} );\n","/**\r\n * Renders the action buttons to the right of the app menu. i.e. Publish\r\n *\r\n * @package Ninja Forms builder\r\n * @subpackage App\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'views/app/menuButtons',[], function() {\r\n\tvar view = Marionette.ItemView.extend({\r\n\t\ttagName: 'span',\r\n\t\ttemplate: '#tmpl-nf-app-header-action-button',\r\n\r\n\t\tinitialize: function() {\r\n\t\t\t// Listen to changes on the app 'clean' state. When it changes, re-render.\r\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'change:clean', this.render, this );\r\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'change:loading', this.render, this );\r\n\r\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'response:updateDB', this.bounceIcon, this );\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * These functions are available to templates, and help us to remove logic from template files.\r\n\t\t * \r\n\t\t * @since  3.0\r\n\t\t * @return Object\r\n\t\t */\r\n\t\ttemplateHelpers: function () {\r\n\t\t\tvar that = this;\r\n\t    \treturn {\r\n\r\n\t    \t\t/**\r\n\t    \t\t * Render our Publish button. If we're loading, render the loading version.\r\n\t    \t\t *\r\n\t    \t\t * @since  3.0\r\n\t    \t\t * @return string\r\n\t    \t\t */\r\n\t    \t\trenderPublish: function() {\r\n\t    \t\t\tif ( that.publishWidth ) {\r\n\t    \t\t\t\tthis.publishWidth = 'style=\"width:' + that.publishWidth + 'px !important\"';\r\n\t    \t\t\t} else {\r\n\t    \t\t\t\tthis.publishWidth = '';\r\n\t    \t\t\t}\r\n\t    \t\t\tif ( nfRadio.channel( 'app' ).request( 'get:setting', 'loading' ) ) {\r\n\t    \t\t\t\tvar template = nfRadio.channel( 'app' ).request( 'get:template',  '#tmpl-nf-add-header-publish-loading' );\r\n\t    \t\t\t} else {\r\n\t    \t\t\t\tvar template = nfRadio.channel( 'app' ).request( 'get:template',  '#tmpl-nf-app-header-publish-button' );\r\n\t    \t\t\t}\r\n\t    \t\t\treturn template( this );\r\n\t    \t\t},\r\n\r\n\t    \t\t/**\r\n\t    \t\t * If our app state is clean, disable publish.\r\n\t    \t\t * \r\n\t    \t\t * @since  3.0\r\n\t    \t\t * @return string\r\n\t    \t\t */\r\n\t    \t\tmaybeDisabled: function() {\r\n\t    \t\t\tif ( nfRadio.channel( 'app' ).request( 'get:setting', 'clean' ) ) {\r\n\t    \t\t\t\treturn 'disabled';\r\n\t    \t\t\t} else {\r\n\t    \t\t\t\treturn '';\r\n\t    \t\t\t}\r\n\t    \t\t},\r\n\r\n\t    \t\t/**\r\n\t    \t\t * If our app isn't clean, render our 'viewChanges' button.\r\n\t    \t\t * @since  version\r\n\t    \t\t * @return {[type]} [description]\r\n\t    \t\t */\r\n\t    \t\tmaybeRenderCancel: function() {\r\n\t    \t\t\tif ( ! nfRadio.channel( 'app' ).request( 'get:setting', 'clean' ) ) {\r\n\t    \t\t\t\tvar viewChanges = nfRadio.channel( 'app' ).request( 'get:template',  '#tmpl-nf-app-header-view-changes' );\r\n\t    \t\t\t\treturn viewChanges( this );\r\n\t    \t\t\t} else {\r\n\t    \t\t\t\treturn '';\r\n\t    \t\t\t}\r\n\t\t\t\t},\r\n\t\t\t};\r\n\t\t},\r\n\r\n\t\tonShow: function() {\r\n\t\t\tvar publishEL = jQuery( this.el ).find( '.publish' );\r\n\t\t\t// this.publishWidth = jQuery( publishEL ).outerWidth( true );\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Listen for clicks on the Publish or view changes button.\r\n\t\t * @type {Object}\r\n\t\t */\r\n\t\tevents: {\r\n\t\t\t'click .publish': 'clickPublish',\r\n\t\t\t'click .viewChanges': 'clickViewChanges'\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * When we click publish, trigger a radio event.\r\n\t\t * This lets us separate the logic from the click event and view.\r\n\t\t * \r\n\t\t * @since  3.0\r\n\t\t * @param  Object \te event\r\n\t\t * @return void\r\n\t\t */\r\n\t\tclickPublish: function( e ) {\r\n\t\t\tnfRadio.channel( 'app' ).trigger( 'click:publish', e );\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * When we click view changes, trigger a radio event.\r\n\t\t * This lets us separate the logic from the click event and view.\r\n\t\t * \r\n\t\t * @since  3.0\r\n\t\t * @param  Object \te event\r\n\t\t * @return void\r\n\t\t */\r\n\t\tclickViewChanges: function( e ) {\r\n\t\t\tnfRadio.channel( 'app' ).trigger( 'click:viewChanges', e );\r\n\t\t},\r\n\r\n\t\tbounceIcon: function( changeModel ) {\r\n\t\t\tjQuery( this.el ).find( '.dashicons-backup' ).effect( 'bounce', { times: 3 }, 600 );\r\n\t\t}\r\n\r\n\t});\r\n\r\n\treturn view;\r\n} );\n","/**\r\n * Renders the action buttons to the right of the app menu. i.e. Publish\r\n *\r\n * @package Ninja Forms builder\r\n * @subpackage App\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'views/app/mobileMenuButton',[], function() {\r\n\tvar view = Marionette.ItemView.extend({\r\n\t\ttagName: 'span',\r\n\t\ttemplate: '#tmpl-nf-mobile-menu-button',\r\n\r\n\t\tinitialize: function() {\r\n\t\t\t// Listen to changes on the app 'clean' state. When it changes, re-render.\r\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'change:clean', this.render, this );\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * These functions are available to templates, and help us to remove logic from template files.\r\n\t\t * \r\n\t\t * @since  3.0\r\n\t\t * @return Object\r\n\t\t */\r\n\t\ttemplateHelpers: function () {\r\n\t\t\tvar that = this;\r\n\t    \treturn {\r\n\t    \t\t/**\r\n\t    \t\t * If our app state is clean, disable button.\r\n\t    \t\t * \r\n\t    \t\t * @since  3.0\r\n\t    \t\t * @return string\r\n\t    \t\t */\r\n\t    \t\tmaybeDisabled: function() {\r\n\t    \t\t\tif ( nfRadio.channel( 'app' ).request( 'get:setting', 'clean' ) ) {\r\n\t    \t\t\t\treturn 'disabled';\r\n\t    \t\t\t} else {\r\n\t    \t\t\t\treturn '';\r\n\t    \t\t\t}\r\n\t    \t\t}\r\n\t\t\t};\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Listen for clicks on the mobile menu button.\r\n\t\t * @type {Object}\r\n\t\t */\r\n\t\tevents: {\r\n\t\t\t'click .nf-mobile-menu': 'clickMobileMenu'\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * When we click publish, trigger a radio event.\r\n\t\t * This lets us separate the logic from the click event and view.\r\n\t\t * \r\n\t\t * @since  3.0\r\n\t\t * @param  Object \te event\r\n\t\t * @return void\r\n\t\t */\r\n\t\tclickMobileMenu: function( e) {\r\n\t\t\tvar builderEl = nfRadio.channel( 'app' ).request( 'get:builderEl' );\r\n\t\t\tjQuery( builderEl ).toggleClass( 'nf-menu-expand' );\r\n\t\t}\r\n\t});\r\n\r\n\treturn view;\r\n} );\n","/**\r\n * Main application header. Includes links to all of our domains.\r\n *\r\n * @package Ninja Forms builder\r\n * @subpackage App\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'views/app/header',['views/app/menu', 'views/app/menuButtons', 'views/app/mobileMenuButton'], function( appMenuCollectionView, appMenuButtonsView, mobileMenuButtonView ) {\r\n\tvar view = Marionette.LayoutView.extend( {\r\n\t\ttagName: 'div',\r\n\t\ttemplate: '#tmpl-nf-app-header',\r\n\r\n\t\tregions: {\r\n\t\t\t// Menu is our main app menu.\r\n\t\t\tmenu: '.nf-app-menu',\r\n\t\t\t// Buttons represents the 'view changes' and 'Publish' buttons.\r\n\t\t\tbuttons: '.nf-app-buttons',\r\n\t\t\tmobileMenuButton: '.nf-mobile-menu-button'\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Since this is a layout region, we need to fill the two areas: menu and buttons whenever we show this view.\r\n\t\t * \r\n\t\t * @since  3.0\r\n\t\t * @return void\r\n\t\t */\r\n\t\tonRender: function() {\r\n\t\t\t// Get our domains\r\n\t\t\tvar appDomainCollection = nfRadio.channel( 'app' ).request( 'get:domainCollection' );\r\n\t\t\t// show the menu area using the appropriate view, passing our domain collection.\r\n\t\t\tthis.menu.show( new appMenuCollectionView( { collection: appDomainCollection } ) );\r\n\t\t\tthis.buttons.show( new appMenuButtonsView() );\r\n\t\t\tthis.mobileMenuButton.show( new mobileMenuButtonView() );\r\n\t\t},\r\n\r\n\t\tevents: {\r\n\t\t\t'click #nf-logo': 'clickLogo'\r\n\t\t},\r\n\r\n\t\tclickLogo: function( e ) {\r\n\t\t\t\r\n\t\t}\r\n\r\n\t} );\r\n\r\n\treturn view;\r\n} );\n","/**\r\n * Renders our sub-header. i.e. add new field, add new action, etc.\r\n *\r\n * @package Ninja Forms builder\r\n * @subpackage App\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'views/app/subHeader',[], function() {\r\n\tvar view = Marionette.ItemView.extend({\r\n\t\ttagName: 'div',\r\n\t\ttemplate: '#tmpl-nf-sub-header'\r\n\t});\r\n\r\n\treturn view;\r\n} );\n","/**\r\n * Renders our builder header.\r\n *\r\n * This is a layout view and handles two regions:\r\n * app - menu/buttons\r\n * subapp - title, add new field, etc.\r\n *\r\n * @package Ninja Forms builder\r\n * @subpackage App\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'views/app/builderHeader',[ 'views/app/header', 'views/app/subHeader' ], function( appHeaderView, appSubHeaderView ) {\r\n\r\n\tvar view = Marionette.LayoutView.extend({\r\n\t\ttagName: \"div\",\r\n\t\ttemplate: \"#tmpl-nf-header\",\r\n\r\n\t\tregions: {\r\n\t\t\tapp: \"#nf-app-header\",\r\n\t\t\tformTitle: \"#nf-app-form-title\",\r\n\t\t\tappSub: \"#nf-app-sub-header\"\r\n\t\t},\r\n\r\n\t\tinitialize: function() {\r\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'change:currentDomain', this.changeSubHeader );\r\n\t\t},\r\n\r\n\t\tonShow: function() {\r\n\t\t\tthis.app.show( new appHeaderView() );\r\n\r\n\t\t\tvar formData = nfRadio.channel( 'app' ).request( 'get:formModel' );\r\n\t\t\tvar formSettings = formData.get( 'settings' );\r\n\r\n\t\t\tvar formTitleView = nfRadio.channel( 'views' ).request( 'get:formTitle' );\r\n\t\t\tthis.formTitle.show( new formTitleView( { model: formSettings } ) );\r\n\r\n\t\t\tthis.changeSubHeader();\r\n\t\t},\r\n\r\n\t\tchangeSubHeader: function() {\r\n\t\t\tvar currentDomain = nfRadio.channel( 'app' ).request( 'get:currentDomain' );\r\n\t\t\tvar subHeaderView = currentDomain.get( 'getSubHeaderView' ).call( currentDomain );\r\n\t\t\tthis.appSub.show( subHeaderView );\r\n\t\t}\r\n\t});\r\n\r\n\treturn view;\r\n} );\n","/**\r\n * Renders our builder.\r\n *\r\n * This is a layout view and handles three regions:\r\n * gutterLeft - gutter to the left of our main content area\r\n * body - main content area\r\n * gutterRight - gutter to the right of our main content area\r\n *\r\n * @package Ninja Forms builder\r\n * @subpackage App\r\n * @copyright (c) 2016 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'views/app/main',[], function() {\r\n\r\n\tvar view = Marionette.LayoutView.extend({\r\n\t\ttagName: 'div',\r\n\t\ttemplate: '#tmpl-nf-main',\r\n\t\tclassName: 'nf-main-test',\r\n\t\tmaybeDone: false,\r\n\r\n\t\toffsetRight: false,\r\n\t\toffsetLeft: false,\r\n\r\n\t\tregions: {\r\n\t\t\tgutterLeft: '#nf-main-gutter-left',\r\n\t\t\tbody: '#nf-main-body',\r\n\t\t\tgutterRight: '#nf-main-gutter-right'\r\n\t\t},\r\n\r\n\t\tinitialize: function() {\r\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'change:currentDomain', this.render );\r\n\t\t\tnfRadio.channel( 'app' ).reply( 'get:mainEl', this.getMainEl, this );\r\n\r\n\t\t\t/*\r\n\t\t\t * Make sure that our gutters resize to match our screen upon resize or drawer open/close.\r\n\t\t\t */\r\n\t\t\tjQuery( window ).on( 'resize', { context: this }, this.resizeBothGutters );\r\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer' ), 'before:open', this.setBothGuttersAbsolute );\r\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer' ), 'opened', this.setBothGuttersFixed );\r\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer' ), 'before:close', this.setBothGuttersAbsolute );\r\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer' ), 'closed', this.setBothGuttersFixed );\r\n\t\t\t// ... or Domain Change.\r\n            this.listenTo( nfRadio.channel( 'app' ), 'change:currentDomain', function(){\r\n                // @todo Using a timeout feels like a hack, but there may be a timing issue here.\r\n            \tsetTimeout(function(){\r\n                    nfRadio.channel( 'app' ).request( 'update:gutters' );\r\n\t\t\t\t}, 300, this );\r\n\t\t\t}, this );\r\n\r\n\r\n\t\t\t/*\r\n\t\t\t * Reply to messages requesting that we resize our gutters.\r\n\t\t\t */\r\n\t\t\tnfRadio.channel( 'app' ).reply( 'update:gutters', this.updateGutters, this );\r\n\t\t},\r\n\r\n\t\tonShow: function() {\r\n\t\t\tnfRadio.channel( 'main' ).trigger( 'show:main', this );\r\n\t\t},\r\n\r\n\t\tonRender: function() {\r\n\t\t\tvar currentDomain = nfRadio.channel( 'app' ).request( 'get:currentDomain' );\r\n\t\t\tvar bodyView = currentDomain.get( 'getMainContentView' ).call( currentDomain );\r\n\t\t\tthis.body.show( bodyView );\r\n\r\n\t\t\tvar gutterLeftView = currentDomain.get( 'getGutterLeftView' ).call( currentDomain );\r\n\t\t\tthis.gutterLeft.show( gutterLeftView );\r\n\r\n\t\t\tvar gutterRightView = currentDomain.get( 'getGutterRightView' ).call( currentDomain );\r\n\t\t\tthis.gutterRight.show( gutterRightView );\r\n\t\t\t\r\n\t\t\tnfRadio.channel( 'main' ).trigger( 'render:main' );\r\n\t\t},\r\n\r\n\t\tgetMainEl: function() {\r\n\t\t\treturn jQuery( this.el ).parent();\r\n\t\t},\r\n\r\n\t\tonAttach: function() {\r\n\t\t\tthis.initialGutterResize();\r\n\t\t},\r\n\r\n\t\tonBeforeDestroy: function() {\r\n\t\t\tjQuery( window ).off( 'resize', this.resize );\r\n\t\t},\r\n\r\n\t\tinitialGutterResize: function() {\r\n\t\t\tthis.resizeGutter( this.gutterLeft.el );\r\n\t\t\tthis.resizeGutter( this.gutterRight.el );\r\n\t\t\tthis.setBothGuttersFixed( this );\r\n\t\t},\r\n\r\n\t\tresizeBothGutters: function( e ) {\r\n\t\t\tvar context = ( e ) ? e.data.context : this;\r\n\r\n\t\t\tvar leftEl = context.gutterLeft.el;\r\n\t\t\tvar rightEl = context.gutterRight.el;\r\n\t\t\t\r\n\t\t\tcontext.resizeGutter( leftEl, context );\r\n\t\t\tcontext.resizeGutter( rightEl, context );\r\n\r\n\t\t\tcontext.setBothGuttersAbsolute( context );\r\n\r\n\t\t\t/*\r\n\t\t\t * Clear our timeout. If the timeout runs, it means we've stopped resizing.\r\n\t\t\t */\t\r\n\t\t\tclearTimeout( context.maybeDone );\r\n\t\t\t/*\r\n\t\t\t * Add our timeout.\r\n\t\t\t */\r\n\t\t\tcontext.maybeDone = setTimeout( context.setBothGuttersFixed, 100, context );\r\n\t\t},\r\n\r\n\t\tresizeGutter: function( el, context ) {\r\n\t\t\tvar top = jQuery( el ).offset().top;\r\n\t\t\tvar viewHeight = jQuery( window ).height();\r\n\t\t\tvar height = viewHeight - top;\r\n\t\t\tjQuery( el ).height( height );\r\n\t\t},\r\n\r\n\t\tsetBothGuttersFixed: function( context ) {\r\n\t\t\tcontext = context || this;\r\n\r\n\t\t\tvar offsetLeft = jQuery( context.gutterLeft.el ).offset();\r\n\t\t\tvar topLeft = offsetLeft.top;\r\n\t\t\tvar leftLeft = offsetLeft.left;\r\n\r\n\t\t\tjQuery( context.gutterLeft.el ).css( { position: 'fixed', left: leftLeft, top: topLeft } );\t\t\tvar offsetLeft = jQuery( context.gutterLeft.el ).offset();\r\n\t\t\t\r\n\t\t\tvar offsetRight = jQuery( context.gutterRight.el ).offset();\r\n\t\t\tvar topRight = offsetRight.top;\r\n\t\t\tvar leftRight = offsetRight.left;\r\n\r\n\t\t\tjQuery( context.gutterRight.el ).css( { position: 'fixed', left: leftRight, top: topRight } );\r\n\t\t},\r\n\r\n\t\tsetBothGuttersAbsolute: function( context ) {\r\n\t\t\tcontext = context || this;\r\n\r\n\t\t\tvar offsetLeft = jQuery( context.gutterLeft.el ).offset();\r\n\t\t\tvar offsetRight = jQuery( context.gutterRight.el ).offset();\r\n\r\n\t\t\tvar scrollTop = jQuery( '#nf-main' ).scrollTop();\r\n\r\n\t\t\tjQuery( context.gutterLeft.el ).css( { position: 'absolute', left: 0, top: scrollTop } );\r\n\t\t\tjQuery( context.gutterRight.el ).css( { position: 'absolute', top: scrollTop, right: 0, left: 'auto' } );\r\n\t\t},\r\n\r\n\t\tupdateGutters: function() {\r\n\t\t\tthis.resizeBothGutters();\r\n\t\t}\r\n\r\n\t});\r\n\r\n\treturn view;\r\n} );\r\n\n","/**\r\n * Renders an application menu item from a domain model.\r\n *\r\n * @package Ninja Forms builder\r\n * @subpackage App\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'views/app/mobileMenuItem',[], function() {\r\n\tvar view = Marionette.ItemView.extend({\r\n\t\ttagName: 'div',\r\n\t\ttemplate: '#tmpl-nf-mobile-menu-item',\r\n\r\n\t\t/**\r\n\t\t * When we render this view, remove the extra <div> tag created by backbone.\r\n\t\t * \r\n\t\t * @since  3.0\r\n\t\t * @return void\r\n\t\t */\r\n\t\tonRender: function() {\r\n\t\t\tthis.$el = this.$el.children();\r\n\t\t\tthis.$el.unwrap();\r\n\t\t\tthis.setElement( this.$el );\r\n\t\t},\r\n\r\n\t\t// Listen for clicks on our app menu.\r\n\t\tevents: {\r\n\t\t\t'click a': 'clickAppMenu'\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * When we click on a menu item, fire a radio event.\r\n\t\t * This lets us separate the logic from the click event and view.\r\n\t\t * We pass this.model so that we know what item was clicked.\r\n\t\t * \r\n\t\t * @since  3.0\r\n\t\t * @param  Object\te event\r\n\t\t * @return return\r\n\t\t */\r\n\t\tclickAppMenu: function( e ) {\r\n\t\t\tnfRadio.channel( 'app' ).trigger( 'click:menu', e, this.model );\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * These functions are available to templates, and help us to remove logic from template files.\r\n\t\t * \r\n\t\t * @since  3.0\r\n\t\t * @return Object\r\n\t\t */\r\n\t\ttemplateHelpers: function() {\r\n\t\t\treturn {\r\n\t\t\t\t/**\r\n\t\t\t\t * If we have any dashicons in our model, render them.\r\n\t\t\t\t * \r\n\t\t\t\t * @since  3.0\r\n\t\t\t\t * @return string\r\n\t\t\t\t */\r\n\t\t\t\trenderDashicons: function() {\r\n\t\t\t\t\tif ( this.mobileDashicon ) {\r\n\t\t\t\t\t\treturn '<span class=\"dashicons ' + this.mobileDashicon + '\"></span>'\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\treturn '';\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\t/**\r\n\t\t\t\t * Render classes for our menu item, including active.\r\n\t\t\t\t * \r\n\t\t\t\t * @since  3.0\r\n\t\t\t\t * @return string\r\n\t\t\t\t */\r\n\t\t\t\trenderClasses: function() {\r\n\t\t\t\t\tvar classes = this.classes;\r\n\t\t\t\t\tvar currentDomain = nfRadio.channel( 'app' ).request( 'get:currentDomain' );\r\n\t\t\t\t\tif ( currentDomain.get( 'id' ) == this.id ) {\r\n\t\t\t\t\t\tclasses += ' active';\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn classes;\r\n\t\t\t\t},\r\n\t\t\t\t/**\r\n\t\t\t\t * If our menu is a link (like preview), render its url.\r\n\t\t\t\t * \r\n\t\t\t\t * @since  3.0\r\n\t\t\t\t * @return string\r\n\t\t\t\t */\r\n\t\t\t\trenderUrl: function() {\r\n\t\t\t\t\tif ( '' != this.url ) {\r\n\t\t\t\t\t\tvar formModel = nfRadio.channel( 'app' ).request( 'get:formModel' );\r\n\t\t\t\t\t\treturn this.url + formModel.get( 'id' );\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\treturn '#';\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\t/**\r\n\t\t\t\t * If our menu is a link (like preview), render its target.\r\n\t\t\t\t * \r\n\t\t\t\t * @since  3.0\r\n\t\t\t\t * @return string\r\n\t\t\t\t */\r\n\t\t\t\trenderTarget: function() {\r\n\t\t\t\t\tif ( '' != this.url ) {\r\n\t\t\t\t\t\treturn '_blank';\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\treturn '_self';\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\r\n\t\t\t\t/**\r\n\t\t\t\t * If our menu item is disabled, output 'disabled'\r\n\t\t\t\t * \r\n\t\t\t\t * @since  3.0\r\n\t\t\t\t * @return string\r\n\t\t\t\t */\r\n\t\t\t\trenderDisabled: function() {\r\n\t\t\t\t\tif ( this.disabled ) {\r\n\t\t\t\t\t\treturn 'disabled';\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\treturn '';\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t});\r\n\r\n\treturn view;\r\n} );\n","/**\r\n * Single item view used for the menu drawer.\r\n *\r\n * @package Ninja Forms builder\r\n * @subpackage App\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'views/app/mobileMenu',['views/app/mobileMenuItem'], function( mobileMenuItemView ) {\r\n\tvar view = Marionette.CompositeView.extend({\r\n\t\ttagName: 'div',\r\n\t\ttemplate: '#tmpl-nf-mobile-menu',\r\n\t\tchildView: mobileMenuItemView,\r\n\r\n\t\tinitialize: function() {\r\n\t\t\t// Listen to changes on the app 'clean' state. When it changes, re-render.\r\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'change:clean', this.render, this );\r\n\t\t},\r\n\r\n\t\tattachHtml: function( collectionView, childView ) {\r\n\t\t\tjQuery( collectionView.el ).find( '.secondary' ).append( childView.el );\r\n\t\t},\r\n\r\n\t\ttemplateHelpers: function() {\r\n\t\t\treturn {\r\n\t\t\t\t/**\r\n\t    \t\t * If our app state is clean, disable button.\r\n\t    \t\t * \r\n\t    \t\t * @since  3.0\r\n\t    \t\t * @return string\r\n\t    \t\t */\r\n\t    \t\tmaybeDisabled: function() {\r\n\t    \t\t\tif ( nfRadio.channel( 'app' ).request( 'get:setting', 'clean' ) ) {\r\n\t    \t\t\t\treturn 'disabled';\r\n\t    \t\t\t} else {\r\n\t    \t\t\t\treturn '';\r\n\t    \t\t\t}\r\n\t    \t\t}\r\n\t\t\t};\r\n\t\t},\r\n\r\n\t\tevents: {\r\n\t\t\t'click .nf-publish': 'clickPublish'\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * When we click publish, trigger a radio event.\r\n\t\t * This lets us separate the logic from the click event and view.\r\n\t\t * \r\n\t\t * @since  3.0\r\n\t\t * @param  Object \te event\r\n\t\t * @return void\r\n\t\t */\r\n\t\tclickPublish: function( e ) {\r\n\t\t\tnfRadio.channel( 'app' ).trigger( 'click:publish', e );\r\n\t\t\tvar builderEl = nfRadio.channel( 'app' ).request( 'get:builderEl' );\r\n\t\t\tjQuery( builderEl ).toggleClass( 'nf-menu-expand' );\r\n\t\t},\r\n\t});\r\n\r\n\treturn view;\r\n} );\n","/**\r\n * Empty drawer content view.\r\n * Called before we close the drawer.\r\n *\r\n * @package Ninja Forms builder\r\n * @subpackage App\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'views/app/drawer/contentEmpty',[], function() {\r\n\tvar view = Marionette.ItemView.extend({\r\n\t\ttagName: 'div',\r\n\t\ttemplate: '#tmpl-nf-empty'\r\n\t});\r\n\r\n\treturn view;\r\n} );\n","/**\r\n * Renders our drawer region\r\n *\r\n * @package Ninja Forms builder\r\n * @subpackage App\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'views/app/drawer',['views/app/drawer/contentEmpty'], function( drawerEmptyView ) {\r\n\r\n\tvar view = Marionette.LayoutView.extend( {\r\n\t\ttemplate: '#tmpl-nf-drawer',\r\n\r\n\t\tregions: {\r\n\t\t\theader: '#nf-drawer-header',\r\n\t\t\tcontent: '#nf-drawer-content',\r\n\t\t\tfooter: '#nf-drawer-footer'\r\n\t\t},\r\n\r\n\t\tinitialize: function() {\r\n\t\t\tnfRadio.channel( 'app' ).reply( 'get:drawerEl', this.getEl, this );\r\n\t\t\tnfRadio.channel( 'drawer' ).reply( 'load:drawerContent', this.loadContent, this );\r\n\t\t\tnfRadio.channel( 'drawer' ).reply( 'empty:drawerContent', this.emptyContent, this );\r\n\t\t},\r\n\r\n\t\tonShow: function() {\r\n\t\t\tjQuery( this.el ).parent().perfectScrollbar();\r\n\t\t},\r\n\r\n\t\tloadContent: function( drawerID, data ) {\r\n\t\t\tvar drawer = nfRadio.channel( 'app' ).request( 'get:drawer', drawerID );\r\n\t\t\tvar contentView = drawer.get( 'getContentView' ).call( drawer, data );\r\n\t\t\tvar headerView = drawer.get( 'getHeaderView' ).call( drawer, data );\r\n\t\t\tvar footerView = drawer.get( 'getFooterView' ).call( drawer, data );\r\n\r\n\t\t\tthis.header.show( headerView );\r\n\t\t\tthis.content.show( contentView );\r\n\t\t\tthis.footer.show( footerView );\r\n\r\n\t\t},\r\n\r\n\t\temptyContent: function() {\r\n\t\t\tthis.header.empty();\r\n\t\t\tthis.content.empty();\r\n\t\t\tthis.footer.empty();\r\n\t\t},\r\n\r\n\t\tgetEl: function() {\r\n\t\t\treturn jQuery( this.el ).parent();\r\n\t\t},\r\n\r\n\t\tevents: {\r\n\t\t\t'click .nf-toggle-drawer': 'clickToggleDrawer'\r\n\t\t},\r\n\r\n\t\tclickToggleDrawer: function() {\r\n\t\t\tnfRadio.channel( 'app' ).trigger( 'click:toggleDrawerSize' );\r\n\t\t}\r\n\r\n\t} );\r\n\r\n\treturn view;\r\n} );\r\n\n","/**\r\n * Single item view used for merge tags.\r\n *\r\n * @package Ninja Forms builder\r\n * @subpackage App\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'views/app/drawer/mergeTagItem',[], function() {\r\n\tvar view = Marionette.ItemView.extend({\r\n\t\ttagName: 'li',\r\n\r\n\t\ttemplate: '#tmpl-nf-merge-tags-item',\r\n\r\n\t\tonBeforeDestroy: function() {\r\n\t\t\tthis.model.off( 'change:active', this.render );\r\n\t\t},\r\n\r\n\t\tinitialize: function() {\r\n\t\t\tthis.model.on( 'change:active', this.render, this );\r\n\t\t},\r\n\r\n\t\tevents: {\r\n\t\t\t'click a': 'clickTag'\r\n\t\t},\r\n\r\n\t\tclickTag: function( e ) {\r\n\t\t\tnfRadio.channel( 'mergeTags' ).trigger( 'click:mergeTag', e, this.model );\r\n\t\t},\r\n\r\n\t\ttemplateHelpers: function() {\r\n\t\t\treturn {\r\n\t\t\t\trenderClasses: function() {\r\n\t\t\t\t\tif ( this.active ) {\r\n\t\t\t\t\t\treturn 'active';\r\n\t\t\t\t\t}\r\n\t\t\t\t}\t\t\t\t\r\n\t\t\t}\r\n\t\t}\r\n\t});\r\n\r\n\treturn view;\r\n} );\n","/**\r\n * Merge tags popup section\r\n *\r\n * @package Ninja Forms builder\r\n * @subpackage App\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'views/app/drawer/mergeTagsSection',['views/app/drawer/mergeTagItem'], function( mergeTagItemView ) {\r\n\tvar view = Marionette.CompositeView.extend({\r\n\t\ttagName: 'div',\r\n\t\tchildView: mergeTagItemView,\r\n\t\ttemplate: '#tmpl-nf-merge-tags-section',\r\n\r\n\t\tinitialize: function() {\r\n\t\t\tthis.collection = this.model.get( 'tags' );\r\n\t\t\tthis.model.on( 'change', this.render, this );\r\n\t\t\tif ( 'fields' == this.model.get( 'id' ) ) {\r\n\t\t\t\t// var fieldCollection = nfRadio.channel( 'fields' ).request( 'get:collection' );\r\n\t\t\t\t// fieldCollection.on( 'all', this.updateFields, this );\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\tonBeforeDestroy: function() {\r\n\t\t\tthis.model.off( 'change', this.render );\r\n\t\t\tif ( 'fields' == this.model.get( 'id' ) ) {\r\n\t\t\t\tvar fieldCollection = nfRadio.channel( 'fields' ).request( 'get:collection' );\r\n\t\t\t\tfieldCollection.off( 'all', this.updateFields, this );\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\tattachHtml: function( collectionView, childView ) {\r\n\t\t\tjQuery( collectionView.el ).find( '.merge-tags' ).append( childView.el );\r\n\t\t},\r\n\r\n\t\tupdateFields: function() {\r\n\t\t\tvar fieldCollection = nfRadio.channel( 'fields' ).request( 'get:collection' );\r\n\t\t\tthis.model.set( 'tags', fieldCollection );\r\n\t\t}\r\n\t});\r\n\r\n\treturn view;\r\n} );\n","/**\r\n * Model that represents our merge tags.\r\n * \r\n * @package Ninja Forms builder\r\n * @subpackage App\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'models/app/mergeTagModel',[], function() {\r\n\tvar model = Backbone.Model.extend( {\r\n\t\tdefaults: {\r\n\t\t\tactive: false,\r\n\t\t\texclude: false\r\n\t\t}\r\n\t} );\r\n\t\r\n\treturn model;\r\n} );\n","/**\r\n * Collections of merge tags.\r\n * \r\n * @package Ninja Forms builder\r\n * @subpackage App\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'models/app/mergeTagCollection',['models/app/mergeTagModel'], function( mergeTagModel ) {\r\n\tvar collection = Backbone.Collection.extend( {\r\n\t\tmodel: mergeTagModel\r\n\t} );\r\n\treturn collection;\r\n} );\n","/**\r\n * Merge tags popup\r\n *\r\n * @package Ninja Forms builder\r\n * @subpackage App\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'views/app/drawer/mergeTagsContent',['views/app/drawer/mergeTagsSection', 'models/app/mergeTagCollection'], function( mergeTagsSectionView, MergeTagCollection ) {\r\n\tvar view = Marionette.CollectionView.extend({\r\n\t\ttagName: 'div',\r\n\t\ttemplate: '#tmpl-nf-merge-tags-content',\r\n\t\tchildView: mergeTagsSectionView,\r\n\r\n\t\tinitialize: function() {\r\n\t\t\tnfRadio.channel( 'mergeTags' ).reply( 'get:view', this.getMergeTagsView, this );\r\n\t\t},\r\n\r\n\t\treRender: function( settingModel ) {\r\n\t\t\tvar mergeTagCollection = nfRadio.channel( 'mergeTags' ).request( 'get:collection' );\r\n\t\t\tvar defaultGroups = mergeTagCollection.where( { default_group: true } );\r\n\r\n\t\t\t/*\r\n\t\t\t * For the Actions Domain, Add Calc Merge Tags as a Default Group.\r\n\t\t\t */\r\n\t\t\tvar currentDomain = nfRadio.channel( 'app' ).request( 'get:currentDomain' );\r\n\t\t\tif( 'actions' == currentDomain.get( 'id' ) ){\r\n\t\t\t\tvar calcMergeTagGroup = mergeTagCollection.where( { id: 'calcs' } );\r\n                defaultGroups = defaultGroups.concat( calcMergeTagGroup );\r\n            }\r\n\r\n\t\t\tthis.collection = new MergeTagCollection( defaultGroups );\r\n\t\t\tvar that = this;\r\n\t\t\tvar useMergeTags = settingModel.get( 'use_merge_tags' );\r\n\t\t\tif ( 'object' == typeof useMergeTags ) {\r\n\t\t\t\tif ( 'undefined' != typeof useMergeTags.exclude ) {\r\n\t\t\t\t\t_.each( useMergeTags.exclude, function( exclude ) {\r\n\t\t\t\t\t\tthat.collection.remove( exclude )\r\n\t\t\t\t\t} );\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif ( 'undefined' != typeof useMergeTags.include ) {\r\n\t\t\t\t\t_.each( mergeTagCollection.models, function( sectionModel ) {\r\n\t\t\t\t\t\tif ( -1 != useMergeTags.include.indexOf( sectionModel.get( 'id' ) ) ) {\r\n\t\t\t\t\t\t\t// console.log( sectionModel );\r\n\t\t\t\t\t\t\tthat.collection.add( sectionModel );\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t} );\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tthis.render();\r\n\t\t},\r\n\r\n\t\tgetMergeTagsView: function() {\r\n\t\t\treturn this;\r\n\t\t}\r\n\t});\r\n\r\n\treturn view;\r\n} );\n","/**\r\n * Builder view.\r\n *\r\n * This layout view has regions that represent our application areas:\r\n * header\r\n * main\r\n * menuDrawer - Mobile side-menu\r\n * drawer\r\n *\r\n * @package Ninja Forms builder\r\n * @subpackage App\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'views/app/builder',['views/app/builderHeader', 'views/app/main', 'views/app/mobileMenu', 'views/app/drawer', 'views/app/drawer/mergeTagsContent'], function( headerView, mainView, mobileMenuView, drawerView, mergeTagsContentView ) {\r\n\tvar view = Marionette.LayoutView.extend( {\r\n\t\ttemplate: \"#tmpl-nf-builder\",\r\n\t\tel: '#nf-builder',\r\n\r\n\t\tregions: {\r\n\t\t\theader: \"#nf-header\",\r\n\t\t\tmain: \"#nf-main\",\r\n\t\t\tmenuDrawer: \"#nf-menu-drawer\",\r\n\t\t\tdrawer: \"#nf-drawer\",\r\n\t\t\tmergeTagsContent: '.merge-tags-content'\r\n\t\t},\r\n\r\n\t\tinitialize: function() {\r\n\t\t\t// Respond to requests asking for the builder dom element.\r\n\t\t\tnfRadio.channel( 'app' ).reply( 'get:builderEl', this.getBuilderEl, this );\r\n\t\t\t// Respond to requests asking for the builder view\r\n\t\t\tnfRadio.channel( 'app' ).reply( 'get:builderView', this.getBuilderView, this );\r\n\t\t\t// Layout views aren't self-rendering.\r\n\t\t\tthis.render();\r\n\t\t\tvar mergeTags = nfRadio.channel( 'mergeTags' ).request( 'get:collection' );\r\n\t\t\tvar mergeTagsClone = mergeTags.clone();\r\n\t\t\tthis.mergeTagsContent.show( new mergeTagsContentView( { collection: mergeTagsClone } ) );\r\n\t\t\t// Show our header.\r\n\t\t\tthis.header.show( new headerView() );\r\n\t\t\t// Show our main content.\r\n\t\t\tthis.main.show( new mainView() );\r\n\t\t\t// Show our mobile menu\r\n\t\t\tvar appDomainCollection = nfRadio.channel( 'app' ).request( 'get:domainCollection' );\r\n\t\t\tthis.menuDrawer.show( new mobileMenuView( { collection: appDomainCollection } ) );\r\n\t\t\t// Show our drawer.\r\n\t\t\tthis.drawer.show( new drawerView() );\r\n\r\n\r\n\t\t},\r\n\r\n\t\tonRender: function() {\r\n\r\n\t\t},\r\n\r\n\t\tgetBuilderEl: function() {\r\n\t\t\treturn this.el;\r\n\t\t},\r\n\r\n\t\tgetBuilderView: function() {\r\n\t\t\treturn this;\r\n\t\t},\r\n\r\n\t\t// Listen for clicks\r\n\t\tevents: {\r\n\t\t\t'click .nf-open-drawer': 'openDrawer',\r\n\t\t\t'click .nf-change-domain': 'changeDomain',\r\n\t\t\t'click .nf-close-drawer': 'closeDrawer'\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Someone clicked to open a drawer, so fire a radio event.\r\n\t\t * This lets us separate the logic from the click event and view.\r\n\t\t *\r\n\t\t * @since  3.0\r\n\t\t * @param  Object \te \tevent\r\n\t\t * @return void\r\n\t\t */\r\n\t\topenDrawer: function( e ) {\r\n\t\t\tnfRadio.channel( 'app' ).trigger( 'click:openDrawer', e );\r\n\t\t},\r\n\t\t/**\r\n\t\t * Someone clicked to close a drawer, so fire a radio event.\r\n\t\t * This lets us separate the logic from the click event and view.\r\n\t\t *\r\n\t\t * @since  3.0\r\n\t\t * @return void\r\n\t\t */\r\n\t\tcloseDrawer: function() {\r\n\t\t\tnfRadio.channel( 'app' ).trigger( 'click:closeDrawer' );\r\n\t\t},\r\n\t\t/**\r\n\t\t * Someone clicked to change the domain, so fire a radio event.\r\n\t\t * This lets us separate the logic from the click event and view.\r\n\t\t *\r\n\t\t * @since  3.0\r\n\t\t * @param  Object \te \tevent\r\n\t\t * @return void\r\n\t\t */\r\n\t\tchangeDomain: function( e ) {\r\n\t\t\tnfRadio.channel( 'app' ).trigger( 'click:menu', e );\r\n\t\t}\r\n\r\n\t} );\r\n\r\n\treturn view;\r\n} );\r\n\n","\r\ndefine( 'controllers/app/remote',[], function() {\r\n    return Marionette.Object.extend( {\r\n        initialize: function() {\r\n            this.listenTo( nfRadio.channel( 'setting' ), 'remote', this.addListener );\r\n        },\r\n\r\n        addListener: function( model, dataModel ) {\r\n\r\n            var listenTo = model.get( 'remote' ).listen;\r\n\r\n            // TODO: Change seems to be triggering twice on each update.\r\n            this.listenTo( nfRadio.channel( 'fieldSetting-' + listenTo ), 'update:setting', this.updateSetting );\r\n            this.listenTo( nfRadio.channel( 'actionSetting-' + listenTo ), 'update:setting', this.updateSetting );\r\n\r\n            this.listenTo( nfRadio.channel( 'setting-type-' + model.get( 'type' ) ), 'click:extra', this.clickExtra );\r\n\r\n            model.listenTo( nfRadio.channel( 'setting-remote' ), 'get:remote', this.getRemote, model );\r\n\r\n            // Auto-trigger get:remote on drawer load.\r\n            nfRadio.channel( 'setting-remote' ).trigger( 'get:remote', dataModel );\r\n        },\r\n\r\n        clickExtra: function( e, settingModel, dataModel, settingView ) {\r\n            jQuery( e.srcElement ).addClass( 'spin' );\r\n            nfRadio.channel( 'setting-remote' ).trigger( 'get:remote', dataModel );\r\n        },\r\n\r\n        updateSetting: function( dataModel, settingModel ) {\r\n            nfRadio.channel( 'setting-remote' ).trigger( 'get:remote', dataModel );\r\n        },\r\n\r\n        getRemote: function( dataModel ) {\r\n\r\n            var remote = this.get( 'remote' );\r\n\r\n            var data = {\r\n                parentValue: dataModel.get( remote.listen ),\r\n                action: remote.action,\r\n                security: ( remote.security ) ? remote.security : nfAdmin.ajaxNonce\r\n            };\r\n\r\n            // TODO: Disable setting and lock drawer while updating.\r\n            var that = this;\r\n            jQuery.post( ajaxurl, data, function( response ){\r\n                var response = JSON.parse( response );\r\n\r\n                if( 'textbox' == that.get( 'type' ) ) {\r\n                    dataModel.set( that.get('name'), response.value );\r\n                }\r\n\r\n                if( 'select' == that.get( 'type' ) ) {\r\n                    that.set( 'options', response.options );\r\n                    that.trigger( 'rerender' );\r\n                }\r\n            });\r\n        },\r\n\r\n    });\r\n} );\n","/**\r\n * Handles opening and closing our drawer. This is where we display settings for fields, actions, and settings.\r\n * \r\n * @package Ninja Forms builder\r\n * @subpackage Main App\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'controllers/app/drawer',[], function() {\r\n\tvar controller = Marionette.Object.extend( {\r\n\t\tinitialize: function() {\r\n\t\t\t// Listen to our drawer-related click events.\r\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'click:openDrawer', this.clickOpenDrawer );\r\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'click:closeDrawer', this.closeDrawer );\r\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'click:toggleDrawerSize', this.toggleDrawerSize );\r\n\r\n\t\t\t// Reply to direct requests to open or close the drawer.\r\n\t\t\tnfRadio.channel( 'app' ).reply( 'open:drawer', this.openDrawer, this );\r\n\t\t\tnfRadio.channel( 'app' ).reply( 'close:drawer', this.closeDrawer, this );\r\n\r\n\t\t\t/*\r\n\t\t\t * When we close the drawer, we have to figure out what the right position should be.\r\n\t\t\t * This listens to requests from other parts of our app asking what the closed right position is.\r\n\t\t\t */\r\n\t\t\tnfRadio.channel( 'drawer' ).reply( 'get:closedRightPos', this.getClosedDrawerPos, this );\r\n\t\t\t\r\n\t\t\t// Reply to requests to prevent our drawer from closing\r\n\t\t\tnfRadio.channel( 'drawer' ).reply( 'prevent:close', this.preventClose, this );\r\n\t\t\t// Reply to requests to enable drawer closing\r\n\t\t\tnfRadio.channel( 'drawer' ).reply( 'enable:close', this.enableClose, this );\r\n\t\t\t// Reply to requests for our disabled/enabled state.\r\n\t\t\tnfRadio.channel( 'drawer' ).reply( 'get:preventClose', this.maybePreventClose, this );\r\n\r\n\t\t\t/*\r\n\t\t\t * Object that holds our array of 'prevent close' values.\r\n\t\t\t * We use an array so that registered requests can unregister and not affect each other.\r\n\t\t\t */\r\n\t\t\tthis.objPreventClose = {};\r\n\r\n\t\t\t/*\r\n\t\t\t *  Listen to focus events on the filter and stop our interval when it happens.\r\n\t\t\t *  This is to fix a bug that can cause the filter to gain focus every few seconds.\r\n\t\t\t */\r\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer' ), 'filter:focused', this.filterFocused );\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Handles closing our drawer\r\n\t\t * @since  3.0\r\n\t\t * @return void\r\n\t\t */\r\n\t\tcloseDrawer: function() {\r\n\t\t\t// Get our current domain.\r\n\t\t\tvar currentDrawer = nfRadio.channel( 'app' ).request( 'get:currentDrawer' );\r\n            if ( ! currentDrawer || this.maybePreventClose() ) {\r\n                return false;\r\n            }\r\n\r\n\t\t\t// Triggers the before close drawer action on our current domain's drawer channel.\r\n\t\t\tnfRadio.channel( 'drawer-' + currentDrawer.get( 'id' ) ).trigger( 'before:closeDrawer' );\r\n\t\t\t/*\r\n\t\t\t * The 'before:closeDrawer' message is deprecated as of version 3.0 in favour of 'before:close'.\r\n\t\t\t * TODO: Remove this radio message in the future.\r\n\t\t\t */\r\n\t\t\tnfRadio.channel( 'drawer' ).trigger( 'before:closeDrawer' );\r\n\t\t\tnfRadio.channel( 'drawer' ).trigger( 'before:close' );\r\n\t\t\t// Send a message to our drawer to empty its contents.\r\n\t\t\tnfRadio.channel( 'drawer' ).request( 'empty:drawerContent' );\r\n\r\n\t\t\t// To close our drawer, we have to add our closed class to the builder and remove the opened class.\r\n\t\t\tvar builderEl = nfRadio.channel( 'app' ).request( 'get:builderEl' );\r\n\t\t\tjQuery( builderEl ).addClass( 'nf-drawer-closed' ).removeClass( 'nf-drawer-opened' );\r\n\t\t\tjQuery( builderEl ).removeClass( 'disable-main' );\r\n\r\n\t\t\t// Get the right position of our closed drawer. Should be container size in -px.\r\n\t\t\tvar rightClosed = this.getClosedDrawerPos();\r\n\r\n\t\t\t// Get our drawer element and give change the 'right' property to our closed position.\r\n\t\t\tvar drawerEl = nfRadio.channel( 'app' ).request( 'get:drawerEl' );\r\n\t\t\tjQuery( drawerEl ).css( { 'right': rightClosed } );\r\n\r\n\t\t\t// In order to access properties in 'this' context in our interval below, we have to set it here.\t\r\n\t\t\tvar that = this;\r\n\r\n\t\t\t/*\r\n\t\t\t * Since jQuery can't bind to a CSS change, we poll every .15 seconds to see if we've closed the drawer.\r\n\t\t\t *\r\n\t\t\t * Once our drawer is closed, we:\r\n\t\t\t * clear our interval\r\n\t\t\t * request that the app change it's current drawer to false\r\n\t\t\t * trigger a drawer closed message\r\n\t\t\t */\r\n\t\t\tthis.checkCloseDrawerPos = setInterval( function() {\r\n\t        \tif ( rightClosed == jQuery( drawerEl ).css( 'right' ) ) {\r\n\t        \t\tclearInterval( that.checkCloseDrawerPos );\r\n\t\t    \t\tnfRadio.channel( 'app' ).request( 'update:currentDrawer', false );\r\n\t\t    \t\tnfRadio.channel( 'drawer' ).trigger( 'closed' );\r\n\t\t    \t\t/*\r\n\t\t    \t\t * Reset the add new button z-index to 98.\r\n\t\t    \t\t */\r\n\t\t    \t\tjQuery( '.nf-master-control' ).css( 'z-index', 98 );\r\n\t\t    \t\t// jQuery( drawerEl ).scrollTop( 0 );\r\n\t        \t}\r\n\t\t\t}, 150 );\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Click handler for our 'open drawer' event.\r\n\t\t * @since  3.0\r\n\t\t * @param  e jQuery event\r\n\t\t * @return void\r\n\t\t */\r\n\t\tclickOpenDrawer: function( e ) {\r\n\t\t\tvar drawerID = jQuery( e.target ).data( 'drawerid' );\r\n\t\t\tthis.openDrawer( drawerID );\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Open our drawer.\r\n\t\t * \r\n\t\t * @since  3.0\r\n\t\t * @param  string drawerID \tID of the drawer we want to open.\r\n\t\t * @param  object data     \tOptional data that we want to pass to the drawer.\r\n\t\t * @return void\r\n\t\t */\r\n\t\topenDrawer: function( drawerID, data ) {\r\n\t\t\tif ( this.maybePreventClose() ) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\r\n\t\t\t// If we haven't sent a data object, set the variable to an empty object.\r\n\t\t\tdata = data || {};\r\n\r\n\t\t\t/*\r\n\t\t\t * If we're dealing with something that has a model, set the proper active state.\r\n\t\t\t *\r\n\t\t\t * TODO: Make this more dynamic. I'm not sure that it fits in the drawer controller.\r\n\t\t\t */\r\n\t\t\tif ( 'undefined' != typeof data.model ) {\r\n\t\t\t\tvar currentDomain = nfRadio.channel( 'app' ).request( 'get:currentDomain' );\r\n\t\t\t\tvar currentDomainID = currentDomain.get( 'id' );\r\n\t\t\t\tnfRadio.channel( currentDomainID ).request( 'clear:editActive' );\r\n\t\t\t\tdata.model.set( 'editActive', true );\r\n\t\t\t\tthis.dataModel = data.model;\r\n\t\t\t}\r\n\r\n\t\t\t// Send out a message requesting our drawer view to load the content for our drawer ID.\r\n\t\t\tnfRadio.channel( 'drawer' ).request( 'load:drawerContent', drawerID, data );\r\n\t\t\tnfRadio.channel( 'drawer' ).trigger( 'before:open' );\r\n\t\t\t\r\n\t\t\t// To open our drawer, we have to add our opened class to our builder element and remove the closed class.\r\n\t\t\tvar builderEl = nfRadio.channel( 'app' ).request( 'get:builderEl' );\r\n\t\t\tjQuery( builderEl ).addClass( 'nf-drawer-opened' ).removeClass( 'nf-drawer-closed' );\r\n\t\t\t\r\n\t\t\t// To open our drawer, we have to set the right position of our drawer to 0px.\r\n\t\t\tvar drawerEl = nfRadio.channel( 'app' ).request( 'get:drawerEl' );\r\n\t\t\tjQuery( drawerEl ).css( { 'right': '0px' } );\r\n\t\t\t\r\n\t\t\t// In order to access properties in 'this' context in our interval below, we have to set it here.\t\r\n\t\t\tvar that = this;\r\n\r\n\t\t\t/*\r\n\t\t\t * Since jQuery can't bind to a CSS change, we poll every .15 seconds to see if we've opened the drawer.\r\n\t\t\t *\r\n\t\t\t * Once our drawer is opened, we:\r\n\t\t\t * clear our interval\r\n\t\t\t * focus our filter\r\n\t\t\t * request that the app update its current drawer to the one we opened\r\n\t\t\t * trigger a drawer opened message\r\n\t\t\t */\r\n\t\t\tthis.hasFocus = false;\r\n\r\n\t\t\t/*\r\n\t\t\t * Set our add new button z-index to 0;\r\n\t\t\t */\r\n\t\t\tjQuery( '.nf-master-control' ).css( 'z-index', 0 );\r\n\r\n\t\t\tthis.checkOpenDrawerPos = setInterval( function() {\r\n\t        \tif ( '0px' == jQuery( drawerEl ).css( 'right' ) ) {\r\n\t        \t\tclearInterval( that.checkOpenDrawerPos );\r\n\t\t\t\t\tif ( ! that.hasFocus ) {\r\n\t\t        \t\tthat.focusFilter();\r\n\t\t\t\t\t\tthat.hasFocus = true;\r\n\t\t\t    \t\tnfRadio.channel( 'app' ).request( 'update:currentDrawer', drawerID );\r\n\t\t\t    \t\tjQuery( drawerEl ).scrollTop( 0 );\r\n\t\t\t    \t\tnfRadio.channel( 'drawer' ).trigger( 'opened' );\r\n\t\t\t\t\t}   \t\t\r\n\t        \t}\r\n\t\t\t}, 150 );\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Toggle the drawer from half to full screen and vise-versa\r\n\t\t * @since  3.0\r\n\t\t * @return void\r\n\t\t */\r\n\t\ttoggleDrawerSize: function() {\r\n\t\t\t// Get our drawer element.\r\n\t\t\tvar drawerEl = nfRadio.channel( 'app' ).request( 'get:drawerEl' );\r\n\t\t\t// toggle our drawer size class.\r\n\t\t\tjQuery( drawerEl ).toggleClass( 'nf-drawer-expand' );\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Focus our filter\r\n\t\t * @since  3.0\r\n\t\t * @return void\r\n\t\t */\r\n        focusFilter: function() {\r\n        \t// Get our filter element\r\n        \tvar filterEl = nfRadio.channel( 'drawer' ).request( 'get:filterEl' );\r\n        \t// Focus\r\n        \tjQuery( filterEl ).focus();\r\n        },\r\n\r\n        /**\r\n         * Get the CSS right position (in px) of the closed drawer element.\r\n         * This is calculated by:\r\n         * getting the width of the builder element\r\n         * add 300 pixels\r\n         * make it negative\r\n         * \r\n         * @since  3.0\r\n         * @return void\r\n         */\r\n        getClosedDrawerPos: function() {\r\n\t\t\tvar builderEl = nfRadio.channel( 'app' ).request( 'get:builderEl' );\r\n\t\t\tvar closedPos = jQuery( builderEl ).width() + 300;\r\n\t\t\treturn '-' + closedPos + 'px';\r\n        },\r\n\r\n        /**\r\n         * Check to see if anything has registered a prevent close key.\r\n         * \r\n         * @since  3.0\r\n         * @return boolean\r\n         */\r\n        maybePreventClose: function() {\r\n        \tif ( 0 == Object.keys( this.objPreventClose ).length ) {\r\n        \t\treturn false;\r\n        \t} else {\r\n        \t\treturn true;\r\n        \t}\r\n        },\r\n\r\n        /**\r\n         * Register a prevent close key.\r\n         * \r\n         * @since  3.0\r\n         * @param  string \tkey unique id for our 'prevent close' setting.\r\n         * @return void\r\n         */\r\n        preventClose: function( key ) {\r\n        \tthis.objPreventClose[ key ] = true;\r\n        \t/*\r\n        \t * When we disable closing the drawer, add the disable class.\r\n        \t */\r\n        \t// Get our current drawer.\r\n\t\t\tthis.dataModel.set( 'drawerDisabled', true );\r\n        },\r\n\r\n        /**\r\n         * Remove a previously registered prevent close key.\r\n         * \r\n         * @since  3.0\r\n         * @param  string \tkey unique id for our 'prevent close' setting.\r\n         * @return void\r\n         */\r\n        enableClose: function( key ) {\r\n        \tdelete this.objPreventClose[ key ];\r\n        \t /*\r\n        \t * When we remove all of our disables preventing closing the drawer, remove the disable class.\r\n        \t */\r\n        \tif ( ! this.maybePreventClose() && 'undefined' != typeof this.dataModel ) {\r\n\t        \t// Get our current drawer.\r\n\t\t\t\tthis.dataModel.set( 'drawerDisabled', false );        \t\t\r\n        \t}\r\n        },\r\n\r\n        /**\r\n         * When we focus our filter, make sure that our open drawer interval is cleared.\r\n         * \r\n         * @since  3.0\r\n         * @return void\r\n         */\r\n        filterFocused: function() {\r\n        \tclearInterval( this.checkOpenDrawerPos );\r\n        },\r\n\r\n        getPreventClose: function() {\r\n        \treturn this.objPreventClose;\r\n        }\r\n\t});\r\n\r\n\treturn controller;\r\n} );\n","/**\r\n * Default drawer header.\r\n *\r\n * Includes our filter/search and 'Done' button.\r\n *\r\n * @package Ninja Forms builder\r\n * @subpackage App\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'views/app/drawer/headerDefault',[], function() {\r\n\tvar view = Marionette.ItemView.extend({\r\n\t\ttagName: 'div',\r\n\t\ttemplate: '#tmpl-nf-drawer-header-default',\r\n\r\n\t\tinitialize: function() {\r\n\t\t\tif ( this.model ) {\r\n\t\t\t\t// Listen for our drawer being disabled.\r\n\t\t\t\tthis.model.on( 'change:drawerDisabled', this.render, this );\t\t\t\t\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * When we render, remove the extra div added by backbone and add listeners related to our filter.\r\n\t\t * \r\n\t\t * @since  3.0\r\n\t\t * @return void\r\n\t\t */\r\n\t\tonRender: function() {\r\n\t\t\t// Remove extra wrapping div.\r\n\t\t\tthis.$el = this.$el.children();\r\n\t\t\tthis.$el.unwrap();\r\n\t\t\tthis.setElement( this.$el );\r\n\t\t\t// Respond to requests related to our filter.\r\n\t\t\tnfRadio.channel( 'drawer' ).reply( 'clear:filter', this.clearFilter, this );\r\n\t\t\tnfRadio.channel( 'drawer' ).reply( 'blur:filter', this.blurFilter, this );\r\n\t\t\tnfRadio.channel( 'drawer' ).reply( 'get:filterEl', this.getEl, this );\r\n\t\t},\r\n\r\n\t\tonBeforeDestroy: function() {\r\n\t\t\tif ( this.model ) {\r\n\t\t\t\tthis.model.off( 'change:drawerDisabled', this.render );\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\tevents: {\r\n\t\t\t'keyup .nf-filter'\t: 'maybeChangeFilter',\r\n\t\t\t'input .nf-filter'\t: 'changeFilter',\r\n\t\t\t'focus input'\t\t: 'getFocus'\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * When the filter text is changed, trigger an event on our current drawer.\r\n\t\t * This lets us keep the logic separate from the click event and view.\r\n\t\t * \r\n\t\t * @since  3.0\r\n\t\t * @param  Object \te event\r\n\t\t * @return void\r\n\t\t */\r\n\t\tchangeFilter: function( e ) {\r\n\t\t\tvar currentDrawer = nfRadio.channel( 'app' ).request( 'get:currentDrawer' );\r\n\t\t\tnfRadio.channel( 'drawer-' + currentDrawer.get( 'id' ) ).trigger( 'change:filter', e.target.value, e );\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * The user pressed a key. If it's the enter key, then run the change filter function.\r\n\t\t * \r\n\t\t * @since  3.0\r\n\t\t * @param  Object \te event\r\n\t\t * @return void\r\n\t\t */\r\n\t\tmaybeChangeFilter: function( e ) {\r\n\t\t\tif ( 13 == e.keyCode ) {\r\n\t\t\t\te.addObject = true;\r\n\t\t\t\tthis.changeFilter( e );\t\t\t\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Clear our filter.\r\n\t\t *\r\n\t\t * This triggers 'input' on the field, which will trigger a change if necessary.\r\n\t\t * \r\n\t\t * @since  3.0\r\n\t\t * @return void\r\n\t\t */\r\n\t\tclearFilter: function() {\r\n\t\t\tvar filterEl =  jQuery( this.el ).find( '.nf-filter' );\r\n\t\t\tif ( '' != jQuery.trim( filterEl.val() ) ) {\r\n\t\t\t\tfilterEl.val('');\r\n\t\t\t\tfilterEl.trigger( 'input' );\r\n\t\t\t\tfilterEl.focus();\t\t\t\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Fire the 'blur' event on our filter. Used to force a change event when the user tabs.\r\n\t\t * \r\n\t\t * @since  3.0\r\n\t\t * @return void\r\n\t\t */\r\n\t\tblurFilter: function() {\r\n\t\t\tjQuery( this.el ).find( '.nf-filter' ).blur();\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Return our filter dom element.\r\n\t\t * \r\n\t\t * @since  3.0\r\n\t\t * @return Object\r\n\t\t */\r\n\t\tgetEl: function() {\r\n\t\t\treturn jQuery( this.el ).find( '.nf-filter' );\r\n\t\t},\r\n\r\n\t\tgetFocus: function() {\r\n\t\t\tnfRadio.channel( 'drawer' ).trigger( 'filter:focused' );\r\n\t\t},\r\n\r\n\t\ttemplateHelpers: function() {\r\n\t\t\treturn {\r\n\t\t\t\trenderDisabled: function() {\r\n\t\t\t\t\t// Get our current domain.\r\n\t\t\t\t\tif ( this.drawerDisabled ) {\r\n\t\t\t\t\t\treturn 'disabled';\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\treturn '';\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t});\r\n\r\n\treturn view;\r\n} );\n","/**\r\n * Default drawer footer\r\n * \r\n * @package Ninja Forms builder\r\n * @subpackage App\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'views/app/drawer/footerDefault',[], function() {\r\n\tvar view = Marionette.ItemView.extend({\r\n\t\ttagName: 'div',\r\n\t\ttemplate: '#tmpl-nf-empty'\r\n\t});\r\n\r\n\treturn view;\r\n} );\n","define( 'models/app/drawerModel',['views/app/drawer/headerDefault', 'views/app/drawer/footerDefault'], function( defaultHeaderView, defaultFooterView ) {\r\n\tvar model = Backbone.Model.extend( {\r\n\t\tdefaults: {\r\n\t\t\tgetHeaderView: function( data ) {\r\n\t\t\t\treturn new defaultHeaderView( data );\r\n\t\t\t},\r\n\r\n\t\t\tgetFooterView: function( data ) {\r\n\t\t\t\treturn new defaultFooterView( data );\r\n\t\t\t}\r\n\t\t}\r\n\t} );\r\n\t\r\n\treturn model;\r\n} );\n","/**\r\n * Collection that holds all of our drawer models.\r\n * \r\n * @package Ninja Forms builder\r\n * @subpackage Fields\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'models/app/drawerCollection',['models/app/drawerModel'], function( drawerModel ) {\r\n\tvar collection = Backbone.Collection.extend( {\r\n\t\tmodel: drawerModel\r\n\t} );\r\n\treturn collection;\r\n} );\n","define( 'views/fields/drawer/stagedField',[], function() {\r\n\tvar view = Marionette.ItemView.extend({\r\n\t\ttagName: 'div',\r\n\t\ttemplate: '#tmpl-nf-drawer-staged-field',\r\n\r\n\t\tonRender: function() {\r\n\t\t\tthis.$el = this.$el.children();\r\n\t\t\tthis.$el.unwrap();\r\n\t\t\tthis.setElement( this.$el );\r\n\t\t},\r\n\r\n\t\tevents: {\r\n\t\t\t'click .dashicons-dismiss': 'removeStagedField'\r\n\t\t},\r\n\r\n\t\tremoveStagedField: function( el ) {\r\n\t\t\tnfRadio.channel( 'drawer-addField' ).trigger( 'click:removeStagedField', el, this.model );\r\n\t\t}\r\n\t});\r\n\r\n\treturn view;\r\n} );\r\n\n","define( 'views/fields/drawer/stagingEmpty',[], function() {\r\n\tvar view = Marionette.ItemView.extend({\r\n\t\ttagName: 'div',\r\n\t\ttemplate: '#tmpl-nf-drawer-staged-fields-empty',\r\n\r\n\t\tonRender: function() {\r\n\t\t\tthis.$el = this.$el.children();\r\n\t\t\tthis.$el.unwrap();\r\n\t\t\tthis.setElement( this.$el );\r\n\t\t}\r\n\t});\r\n\r\n\treturn view;\r\n} );\n","define( 'views/fields/drawer/stagingCollection',['views/fields/drawer/stagedField', 'views/fields/drawer/stagingEmpty'], function( stagedFieldView, stagedFieldsEmptyView ) {\r\n\tvar view = Marionette.CollectionView.extend( {\r\n\t\ttagName: 'div',\r\n\t\tchildView: stagedFieldView,\r\n\t\temptyView: stagedFieldsEmptyView,\r\n\r\n\t\tactiveClass: 'nf-staged-fields-active', // CSS Class for showing the reservoir.\r\n\r\n\t\tinitialize: function() {\r\n\t\t\tnfRadio.channel( 'app' ).reply( 'get:stagedFieldsEl', this.getStagedFieldsEl, this );\r\n\t\t},\r\n\r\n\t\tonShow: function() {\r\n\r\n\t\t\tthis.$el = jQuery( this.el ).parent();\r\n\t\t\tjQuery( this.$el ).find( 'span:first' ).unwrap();\r\n\t\t\tthis.setElement( this.$el );\r\n\r\n\t\t\tvar that = this;\r\n\r\n\t\t\tjQuery( this.el ).sortable( {\r\n\t\t\t\tplaceholder: 'nf-staged-fields-sortable-placeholder',\r\n\t\t\t\thelper: 'clone',\r\n\t\t\t\ttolerance: 'pointer',\r\n\t\t\t\tover: function( e, ui ) {\r\n\t\t\t\t\tnfRadio.channel( 'drawer-addField' ).trigger( 'over:stagedFields', e, ui );\r\n\t\t\t\t},\r\n\r\n\t\t\t\tout: function( e, ui ) {\r\n\t\t\t\t\tnfRadio.channel( 'drawer-addField' ).trigger( 'out:stagedFields', ui );\r\n\t\t\t\t},\r\n\r\n\t\t\t\treceive: function( e, ui ) {\r\n\t\t\t\t\tnfRadio.channel( 'drawer-addField' ).trigger( 'receive:stagedFields', ui );\r\n\t\t\t\t},\r\n\r\n\t\t\t\tupdate: function( e, ui ) {\r\n\t\t\t\t\tnfRadio.channel( 'fields' ).request( 'sort:staging' );\r\n\t\t\t\t},\r\n\r\n\t\t\t\tstart: function( e, ui ) {\r\n\t\t\t\t\tnfRadio.channel( 'drawer-addField' ).trigger( 'start:stagedFields', ui );\r\n\r\n\t\t\t\t},\r\n\r\n\t\t\t\tstop: function( e, ui ) {\r\n\t\t\t\t\tnfRadio.channel( 'drawer-addField' ).trigger( 'stop:stagedFields', ui );\r\n\t\t\t\t}\r\n\t\t\t} );\r\n\r\n\t\t\tjQuery( this.el ).parent().draggable( {\r\n\t\t\t\topacity: 0.9,\r\n\t\t\t\tconnectToSortable: '.nf-field-type-droppable',\r\n\t\t\t\tappendTo: '#nf-main',\r\n\t\t\t\trefreshPositions: true,\r\n\t\t\t\tgrid: [ 3, 3 ],\r\n\t\t\t\ttolerance: 'pointer',\r\n\r\n\t\t\t\thelper: function( e ) {\r\n\t\t\t\t\tvar width = jQuery( e.target ).parent().width();\r\n\t\t\t\t\tvar height = jQuery( e.target ).parent().height();\r\n\t\t\t\t\tvar element = jQuery( e.target ).parent().clone();\r\n\t\t\t\t\tvar left = width / 4;\r\n\t\t\t\t\tvar top = height / 2;\r\n\t\t\t\t\tjQuery( this ).draggable( 'option', 'cursorAt', { top: top, left: left } );\r\n\t\t\t\t\tjQuery( element ).zIndex( 1000 );\r\n\t\t\t\t\treturn element;\r\n\t\t\t\t},\r\n\r\n\t\t\t\tstart: function( e, ui ) {\r\n\t\t\t\t\tnfRadio.channel( 'drawer-addField' ).trigger( 'startDrag:fieldStaging', this, ui );\r\n\t\t\t\t},\r\n\t\t\t\tstop: function( e, ui ) {\r\n\t\t\t\t\tnfRadio.channel( 'drawer-addField' ).trigger( 'stopDrag:fieldStaging', this, ui );\r\n\t\t\t\t}\r\n\t\t\t} );\r\n\t\t},\r\n\r\n\t\tgetStagedFieldsEl: function() {\r\n\t\t\treturn jQuery( this.el );\r\n\t\t},\r\n\r\n\t\tonAddChild: function() {\r\n\t\t\tjQuery( this.el ).addClass( this.activeClass );\r\n\t\t},\r\n\r\n\t\tonRemoveChild: function() {\r\n\t\t\tif( this.hasStagedFields() ) return;\r\n\t\t\tjQuery( this.el ).removeClass( this.activeClass );\r\n\t\t},\r\n\r\n\t\thasStagedFields: function() {\r\n\t\t\treturn  0 != this.collection.length;\r\n\t\t}\r\n\r\n\t} );\r\n\r\n\treturn view;\r\n} );\n","/**\r\n * Model for our staged field.\r\n * \r\n * @package Ninja Forms builder\r\n * @subpackage Fields\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'models/fields/stagingModel',[], function() {\r\n\tvar model = Backbone.Model.extend( {\r\n\t} );\r\n\t\r\n\treturn model;\r\n} );\n","/**\r\n * Collection of staged fields.\r\n * \r\n * @package Ninja Forms builder\r\n * @subpackage Fields\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'models/fields/stagingCollection',['models/fields/stagingModel'], function( stagingModel ) {\r\n\tvar collection = Backbone.Collection.extend( {\r\n\t\tmodel: stagingModel,\r\n\t\tcomparator: 'order'\r\n\t} );\r\n\treturn collection;\r\n} );\n","define( 'views/fields/drawer/typeSection',[], function() {\r\n\tvar view = Marionette.ItemView.extend({\r\n\t\ttagName: 'div',\r\n\t\ttemplate: '#tmpl-nf-drawer-field-type-section',\r\n\r\n\t\tinitialize: function() {\r\n\t\t\t_.bindAll( this, 'render' );\r\n\t\t\tnfRadio.channel( 'fields' ).reply( 'get:typeSection', this.getTypeSection, this );\r\n\t\t},\r\n\r\n\t\tonRender: function() {\r\n\t\t\tthis.$el = this.$el.children();\r\n\t\t\tthis.$el.unwrap();\r\n\t\t\tthis.setElement( this.$el );\r\n\r\n\t\t\tthis.dragging = false;\r\n\t\t\tvar that = this;\r\n\t\t\t/*\r\n\t\t\t * If we're on a mobile device, we don't want to enable dragging for our field type buttons.\r\n\t\t\t */\r\n\t\t\tif ( ! nfRadio.channel( 'app' ).request( 'is:mobile' ) ) {\r\n\t\t\t\tjQuery( this.el ).find( 'div.nf-field-type-draggable' ).draggable( {\r\n\t\t\t\t\topacity: 0.9,\r\n\t\t\t\t\ttolerance: 'pointer',\r\n\t\t\t\t\tconnectToSortable: '.nf-field-type-droppable',\r\n\t\t\t\t\trefreshPositions: true,\r\n\t\t\t\t\tgrid: [ 5, 5 ],\r\n\t\t\t\t\tappendTo: '#nf-builder',\r\n\r\n\t\t\t\t\thelper: function( e ) {\r\n\t\t\t\t\t\tvar width = jQuery( e.target ).parent().width();\r\n\t\t\t\t\t\tvar height = jQuery( e.target ).parent().height();\r\n\t\t\t\t\t\tvar element = jQuery( e.target ).parent().clone();\r\n\t\t\t\t\t\tvar left = width / 4;\r\n\t\t\t\t\t\tvar top = height / 2;\r\n\t\t\t\t\t\tjQuery( this ).draggable( 'option', 'cursorAt', { top: top, left: left } );\r\n\t\t\t\t\t\tjQuery( element ).zIndex( 1000 );\r\n\t\t\t\t\t\treturn element;\r\n\t\t\t\t\t},\r\n\r\n\t\t\t\t\tstart: function( e, ui ) {\r\n\t\t\t\t\t\tthat.dragging = true;\r\n\t\t\t\t\t\tnfRadio.channel( 'drawer-addField' ).trigger( 'startDrag:type', this, ui );\r\n\t\t\t\t\t},\r\n\r\n\t\t\t\t\tstop: function( e, ui ) {\r\n\t\t\t\t\t\tthat.dragging = false;\r\n\t\t\t\t\t\tnfRadio.channel( 'drawer-addField' ).trigger( 'stopDrag:type', this, ui );\r\n\t\t\t\t\t},\r\n\r\n\t\t\t\t\tdrag: function(e, ui) {\r\n\t\t\t\t\t\tnfRadio.channel( 'drawer-addField' ).trigger( 'drag:type', this, ui, e );\t\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t} ).disableSelection();\r\n\r\n\t\t\t\tjQuery( this.el ).find( '.nf-item' ).focus( function() {\r\n\t\t\t    \tjQuery( this ).addClass( 'active' );\r\n\t\t\t    } ).blur( function() {\r\n\t\t\t    \tjQuery( this ).removeClass( 'active' );\r\n\t\t\t    } );\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\tevents: {\r\n\t\t\t'click .nf-item': 'clickFieldType',\r\n\t\t\t'keydown .nf-item': 'maybeClickFieldType',\r\n\t\t\t'mousedown .nf-item': 'mousedownFieldType'\r\n\t\t},\r\n\r\n\t\tclickFieldType: function( e ) {\r\n\t\t\tif ( ! this.dragging ) {\r\n\t\t\t\tnfRadio.channel( 'drawer' ).trigger( 'click:fieldType', e );\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\tmousedownFieldType: function( e ) {\r\n\t\t\tjQuery( e.target).addClass( 'clicked' );\r\n\t\t\tsetTimeout( function() {\r\n\t\t\t\tjQuery( e.target ).removeClass( 'clicked' );\r\n\t\t\t}, 1500 );\r\n\t\t},\r\n\r\n\t\tmaybeClickFieldType: function( e ) {\r\n\t\t\tif ( 13 == e.keyCode ) {\r\n\t\t\t\tthis.clickFieldType( e );\r\n\t\t\t\tnfRadio.channel( 'drawer' ).request( 'clear:filter' );\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\ttemplateHelpers: function() {\r\n\t\t\treturn {\r\n\t\t\t\trenderFieldTypes: function() {\r\n\t\t\t        var html = '';\r\n\t\t\t        var that = this;\r\n\t\t\t        _.each( this.fieldTypes, function( id ) {\r\n\t\t\t            var type = nfRadio.channel( 'fields' ).request( 'get:type', id );\r\n\t\t\t            var nicename = type.get( 'nicename' );\r\n\t\t\t            var icon = type.get( 'icon' );\r\n\t\t\t            var renderType = nfRadio.channel( 'app' ).request( 'get:template',  '#tmpl-nf-drawer-field-type-button' );\r\n\t\t\t            html += renderType( { id: id, nicename: nicename, icon: icon, type: type, savedField: that.savedField } );\r\n\t\t\t        } );\r\n\t\t\t        return html;\r\n\t\t\t\t},\r\n\r\n\t\t\t\tsavedField: function() {\r\n\t\t\t\t\tif( this.type.get( 'savedField' ) ) {\r\n\t\t\t\t\t\treturn 'nf-saved';\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\treturn '';\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\tgetTypeSection: function() {\r\n\t\t\treturn this.el;\r\n\t\t}\r\n\t});\r\n\r\n\treturn view;\r\n} );\r\n\n","define( 'views/fields/drawer/typeSectionCollection',['views/fields/drawer/typeSection'], function( fieldTypeSectionView ) {\r\n\tvar view = Marionette.CollectionView.extend( {\r\n\t\ttagName: 'div',\r\n\t\tchildView: fieldTypeSectionView,\r\n\r\n\t\tonShow: function() {\r\n\t\t\tjQuery( this.el ).find( '.nf-settings' ).unwrap();\r\n\t\t\tnfRadio.channel( 'fields' ).request( 'clear:editActive' );\r\n\t\t}\r\n\t} );\r\n\r\n\treturn view;\r\n} );\n","define( 'views/fields/drawer/addField',['views/fields/drawer/stagingCollection', 'models/fields/stagingCollection', 'views/fields/drawer/typeSectionCollection'], function( drawerStagingView, StagingCollection, fieldTypeSectionCollectionView ) {\r\n\r\n\tvar view = Marionette.LayoutView.extend( {\r\n\t\ttemplate: '#tmpl-nf-drawer-content-add-field',\r\n\r\n\t\tregions: {\r\n\t\t\tstaging: '#nf-drawer-staging .nf-reservoir',\r\n\t\t\tprimary: '#nf-drawer-primary',\r\n\t\t\tsecondary: '#nf-drawer-secondary'\r\n\t\t},\r\n\r\n\t\tinitialize: function() {\r\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer' ), 'filter:fieldTypes', this.filterFieldTypes );\r\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer' ), 'clear:filter', this.removeFieldTypeFilter );\r\n\r\n\t\t\tthis.savedCollection = nfRadio.channel( 'fields' ).request( 'get:savedFields' );\r\n\t\t\tthis.primaryCollection = this.savedCollection;\r\n\r\n\t\t\tthis.fieldTypeSectionCollection = nfRadio.channel( 'fields' ).request( 'get:typeSections' );\r\n\t\t\tthis.secondaryCollection = this.fieldTypeSectionCollection;\r\n\r\n\t\t},\r\n\r\n\t\tonShow: function() {\r\n\t\t\tvar stagingCollection = nfRadio.channel( 'fields' ).request( 'get:staging' );\r\n\t\t\tthis.staging.show( new drawerStagingView( { collection: stagingCollection } ) );\r\n\r\n\t\t\tthis.primary.show( new fieldTypeSectionCollectionView( { collection: this.primaryCollection } ) );\r\n\t\t\tthis.secondary.show( new fieldTypeSectionCollectionView( { collection: this.secondaryCollection } ) );\r\n\t\t},\r\n\r\n\t\tgetEl: function() {\r\n\t\t\treturn jQuery( this.el ).parent();\r\n\t\t},\r\n\r\n\t\tfilterFieldTypes: function( filteredSectionCollection ) {\r\n\t\t\tthis.primary.reset();\r\n\t\t\tthis.secondary.reset();\r\n\t\t\tthis.filteredSectionCollection = filteredSectionCollection;\r\n\t\t\tthis.primary.show( new fieldTypeSectionCollectionView( { collection: this.filteredSectionCollection } ) );\r\n\t\t},\r\n\r\n\t\tremoveFieldTypeFilter: function () {\r\n\t\t\tthis.primary.show( new fieldTypeSectionCollectionView( { collection: this.savedCollection } ) );\r\n\t\t\tthis.secondary.show( new fieldTypeSectionCollectionView( { collection: this.fieldTypeSectionCollection } ) );\r\n\t\t}\r\n\r\n\t} );\r\n\r\n\treturn view;\r\n} );\n","define( 'views/app/drawer/itemSettingCollection',[], function() {\r\n\tvar view = Marionette.CollectionView.extend( {\r\n\t\ttagName: 'div',\r\n\r\n\t\tinitialize: function( data ) {\r\n\t\t\tthis.childViewOptions = { dataModel: data.dataModel };\r\n\t\t},\r\n\r\n\t\tgetChildView: function( model ) {\r\n\t\t\treturn nfRadio.channel( 'app' ).request( 'get:settingChildView', model );\r\n\t\t}\r\n\t} );\r\n\r\n\treturn view;\r\n} );\n","define( 'views/app/drawer/itemSettingGroup',['views/app/drawer/itemSettingCollection'], function( itemSettingCollectionView ) {\r\n\tvar view = Marionette.LayoutView.extend({\r\n\t\ttagName: 'div',\r\n\t\ttemplate: '#tmpl-nf-drawer-content-edit-field-setting-group',\r\n\t\t\r\n\t\tregions: {\r\n\t\t\tsettings: '.nf-field-settings'\r\n\t\t},\r\n\r\n\t\tinitialize: function( data ) {\r\n\t\t\tthis.model.on( 'change', this.render, this );\r\n\t\t\tthis.dataModel = data.dataModel;\r\n\t\t},\r\n\r\n\t\tonBeforeDestroy: function() {\r\n\t\t\tthis.model.off( 'change', this.render );\r\n\t\t},\r\n\r\n\t\tonRender: function() {\r\n\t\t\tif ( this.model.get( 'display' ) ) {\r\n\t\t\t\tthis.settings.show( new itemSettingCollectionView( { collection: this.model.get( 'settings' ), dataModel: this.dataModel } ) );\r\n\t\t\t} else {\r\n\t\t\t\tthis.settings.empty();\r\n\t\t\t}\r\n\r\n\t\t\tnfRadio.channel( 'drawer' ).trigger( 'render:settingGroup', this );\r\n\t\t},\r\n\r\n\t\tevents: {\r\n\t\t\t'click .toggle': 'clickToggleGroup'\r\n\t\t},\r\n\r\n\t\tclickToggleGroup: function( e ) {\r\n\t\t\tnfRadio.channel( 'drawer' ).trigger( 'click:toggleSettingGroup', e, this.model );\r\n\t\t},\r\n\r\n\t\ttemplateHelpers: function() {\r\n\t\t\treturn {\r\n\t\t\t\trenderLabel: function() {\r\n\t\t\t\t\tif ( '' != this.label ) {\r\n\t\t\t\t\t\tvar groupLabel = nfRadio.channel( 'app' ).request( 'get:template',  '#tmpl-nf-drawer-content-edit-setting-group-label' );\r\n\t\t\t\t\t\treturn groupLabel( this );\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\treturn '';\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\r\n\t\t\t\trenderArrowDir: function() {\r\n\t\t\t\t\tif ( this.display ) {\r\n\t\t\t\t\t\treturn 'down';\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\treturn 'right';\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t});\r\n\r\n\treturn view;\r\n} );\n","define( 'views/app/drawer/itemSettingGroupCollection',['views/app/drawer/itemSettingGroup'], function( itemSettingGroupView ) {\r\n\tvar view = Marionette.CollectionView.extend( {\r\n\t\ttagName: 'div',\r\n\t\tchildView: itemSettingGroupView,\r\n\r\n\t\tinitialize: function( data ) {\r\n\t\t\tthis.childViewOptions = { dataModel: data.dataModel };\r\n\t\t}\r\n\t} );\r\n\r\n\treturn view;\r\n} );\n","define( 'views/app/drawer/editSettings',['views/app/drawer/itemSettingGroupCollection'], function( itemSettingGroupCollectionView ) {\r\n\tvar view = Marionette.LayoutView.extend({\r\n\t\ttagName: 'div',\r\n\t\ttemplate: '#tmpl-nf-drawer-content-edit-settings',\r\n\r\n\t\tregions: {\r\n\t\t\tsettingTitle: '.nf-setting-title',\r\n\t\t\tsettingGroups: '.nf-setting-groups'\r\n\t\t},\r\n\r\n\t\tinitialize: function( data ) {\r\n\t\t\tthis.dataModel = data.model;\r\n\t\t\tthis.groupCollection = data.groupCollection;\r\n\t\t},\r\n\r\n\t\tonRender: function() {\r\n\t\t\tvar currentDomain = nfRadio.channel( 'app' ).request( 'get:currentDomain' );\r\n\t\t\tvar titleView = currentDomain.get( 'getSettingsTitleView' ).call( currentDomain, { model: this.model } );\r\n\r\n\t\t\tthis.settingTitle.show( titleView );\r\n\t\t\tthis.settingGroups.show( new itemSettingGroupCollectionView( { collection: this.groupCollection, dataModel: this.dataModel } ) );\r\n\t\t},\r\n\r\n\t\ttemplateHelpers: function () {\r\n\t    \treturn {\r\n\t    \t\tmaybeRenderTitle: function() {\r\n\t    \t\t\tif ( 'undefined' !== typeof this.type ) {\r\n\t    \t\t\t\tvar title = nfRadio.channel( 'app' ).request( 'get:template',  '#tmpl-nf-drawer-content-edit-settings-title' );\r\n\t    \t\t\t\treturn title( this );\r\n\t    \t\t\t} else {\r\n\t    \t\t\t\treturn '';\r\n\t    \t\t\t}\r\n\t    \t\t},\r\n\r\n\t    \t\trenderTypeNicename: function() {\r\n\t    \t\t\tvar currentDomain = nfRadio.channel( 'app' ).request( 'get:currentDomain' );\r\n\t\t\t\t\tvar domainID = currentDomain.get( 'id' );\r\n\t    \t\t\tvar type = nfRadio.channel( domainID ).request( 'get:type', this.type );\r\n\t    \t\t\treturn type.get( 'nicename' );\r\n\t\t\t\t},\r\n\t\t\t};\r\n\t\t},\r\n\t});\r\n\r\n\treturn view;\r\n} );\n","/**\r\n * Edit Settings drawer header.\r\n *\r\n * Includes our 'Done' button.\r\n *\r\n * @package Ninja Forms builder\r\n * @subpackage App\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'views/app/drawer/headerEditSettings',[], function() {\r\n\tvar view = Marionette.ItemView.extend({\r\n\t\ttagName: 'div',\r\n\t\ttemplate: '#tmpl-nf-drawer-header-edit-settings',\r\n\r\n\t\tinitialize: function() {\r\n\t\t\tif ( this.model ) {\r\n\t\t\t\t// Listen for our drawer being disabled.\r\n\t\t\t\tthis.model.on( 'change:drawerDisabled', this.render, this );\t\t\t\t\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\tonBeforeDestroy: function() {\r\n\t\t\tif ( this.model ) {\r\n\t\t\t\tthis.model.off( 'change:drawerDisabled', this.render );\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\ttemplateHelpers: function() {\r\n\t\t\treturn {\r\n\t\t\t\trenderDisabled: function() {\r\n\t\t\t\t\t// Get our current domain.\r\n\t\t\t\t\tif ( this.drawerDisabled ) {\r\n\t\t\t\t\t\treturn 'disabled';\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\treturn '';\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t});\r\n\r\n\treturn view;\r\n} );\n","/**\r\n * Button to add an action to the form.\r\n *\r\n * TODO: make dynamic\r\n * \r\n * @package Ninja Forms builder\r\n * @subpackage Actions\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'views/actions/drawer/typeButton',[], function() {\r\n\tvar view = Marionette.ItemView.extend({\r\n\t\ttagName: 'div',\r\n\t\ttemplate: '#tmpl-nf-drawer-action-type-button',\r\n\r\n\t\tonRender: function() {\r\n\t\t\tthis.$el = this.$el.children();\r\n\t\t\tthis.$el.unwrap();\r\n\t\t\tthis.setElement( this.$el );\r\n\t\t\t\r\n\t\t\tjQuery( this.el ).disableSelection();\r\n\t\t\t\r\n\t\t\tif ( 'installed' == this.model.get( 'section') ) {\r\n\t\t\t\tvar that = this;\r\n\t\t\t\tjQuery( this.el ).draggable( {\r\n\t\t\t\t\topacity: 0.9,\r\n\t\t\t\t\ttolerance: 'intersect',\r\n\t\t\t\t\tscroll: false,\r\n\t\t\t\t\thelper: 'clone',\r\n\r\n\t\t\t\t\tstart: function( e, ui ) {\r\n\t\t\t\t\t\tthat.dragging = true;\r\n\t\t\t\t\t\tnfRadio.channel( 'drawer-addAction' ).trigger( 'startDrag:type', this, ui );\r\n\t\t\t\t\t},\r\n\r\n\t\t\t\t\tstop: function( e, ui ) {\r\n\t\t\t\t\t\tthat.dragging = false;\r\n\t\t\t\t\t\tnfRadio.channel( 'drawer-addAction' ).trigger( 'stopDrag:type', this, ui );\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t} );\r\n\t\t\t}\r\n\t\t\t\r\n\t\t},\r\n\r\n\t\tevents: {\r\n\t\t\t'click .nf-item': 'clickAddAction'\r\n\t\t},\r\n\r\n\t\tclickAddAction: function( e ) {\r\n\t\t\tif ( ! this.dragging ) {\r\n\t\t\t\tif ( 'installed' == this.model.get( 'section' ) ) { // Is this an installed action?\r\n\t\t\t\t\tnfRadio.channel( 'actions' ).trigger( 'click:addAction', this.model );\r\n\t\t\t\t} else { // This isn't an installed action\r\n\t\t\t\t\twindow.open( this.model.get( 'link' ), '_blank' );\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\ttemplateHelpers: function() {\r\n\t\t\treturn {\r\n\t\t\t\trenderClasses: function() {\r\n\t\t\t\t\tvar classes = 'nf-item';\r\n\t\t\t\t\tif ( '' != jQuery.trim( this.image ) ) {\r\n\t\t\t\t\t\tclasses += ' nf-has-img';\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif ( 'installed' == this.section ) {\r\n\t\t\t\t\t\tclasses += ' nf-action-type';\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn classes;\r\n\t\t\t\t},\r\n\r\n\t\t\t\trenderStyle: function() {\r\n\t\t\t\t\tif ( '' != jQuery.trim( this.image ) ) {\r\n\t\t\t\t\t\treturn \"style=\\\"background-image: url(\" + this.image + \");\\\"\"\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\treturn '';\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t});\r\n\r\n\treturn view;\r\n} );\n","define( 'views/actions/drawer/typeCollection',['views/actions/drawer/typeButton'], function( actionTypeButtonView ) {\r\n\tvar view = Marionette.CompositeView.extend( {\r\n\t\ttemplate: '#tmpl-nf-drawer-action-type-section',\r\n\t\tchildView: actionTypeButtonView,\r\n\r\n\t\ttemplateHelpers: function() {\r\n\t\t\tvar that = this;\r\n\t\t\treturn {\r\n\t\t\t\trenderNicename: function() {\r\n\t\t\t\t\treturn that.collection.nicename;\r\n\t\t\t\t},\r\n\r\n\t\t\t\trenderClasses: function() {\r\n\t\t\t\t\treturn that.collection.slug;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\tattachHtml: function( collectionView, childView ) {\r\n\t\t\tjQuery( collectionView.el ).find( '.action-types' ).append( childView.el );\r\n\t\t}\r\n\t} );\r\n\r\n\treturn view;\r\n} );\n","/**\r\n * Add action drawer.\r\n *\r\n * TODO: make dynamic\r\n * \r\n * @package Ninja Forms builder\r\n * @subpackage Actions\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'views/actions/drawer/addAction',['views/actions/drawer/typeCollection'], function( actionTypeCollectionView ) {\r\n\r\n\tvar view = Marionette.LayoutView.extend( {\r\n\t\ttemplate: '#tmpl-nf-drawer-content-add-action',\r\n\r\n\t\tregions: {\r\n\t\t\tprimary: '#nf-drawer-primary',\r\n\t\t\tsecondary: '#nf-drawer-secondary'\r\n\t\t},\r\n\r\n\t\tinitialize: function() {\r\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer' ), 'filter:actionTypes', this.filteractionTypes );\r\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer' ), 'clear:filter', this.removeactionTypeFilter );\r\n\t\t\r\n\t\t\tthis.installedActions = nfRadio.channel( 'actions' ).request( 'get:installedActions' );\r\n\t\t\tthis.primaryCollection = this.installedActions;\r\n\r\n\t\t\tthis.availableActions = nfRadio.channel( 'actions' ).request( 'get:availableActions' );\r\n\t\t\tthis.secondaryCollection = this.availableActions;\r\n\t\t},\r\n\r\n\t\tonShow: function() {\r\n\t\t\tthis.primary.show( new actionTypeCollectionView( { collection: this.primaryCollection } ) );\r\n\t\t\tthis.secondary.show( new actionTypeCollectionView( { collection: this.secondaryCollection } ) );\r\n\t\t},\r\n\r\n\t\tgetEl: function() {\r\n\t\t\treturn jQuery( this.el ).parent();\r\n\t\t},\r\n\r\n\t\tfilteractionTypes: function( filteredInstalled, filteredAvailable ) {\r\n\t\t\tthis.primary.reset();\r\n\t\t\tthis.secondary.reset();\r\n\t\t\tthis.primary.show( new actionTypeCollectionView( { collection: filteredInstalled } ) );\r\n\t\t\tthis.secondary.show( new actionTypeCollectionView( { collection: filteredAvailable } ) );\r\n\t\t\t\r\n\t\t},\r\n\r\n\t\tremoveactionTypeFilter: function () {\r\n\t\t\tthis.primary.show( new actionTypeCollectionView( { collection: this.installedActions } ) );\r\n\t\t\tthis.secondary.show( new actionTypeCollectionView( { collection: this.availableActions } ) );\r\n\t\t}\r\n\r\n\t} );\r\n\r\n\treturn view;\r\n} );\n","/**\r\n * Individual change item.\r\n *\r\n * @package Ninja Forms builder\r\n * @subpackage App\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'views/app/drawer/contentViewChangesItem',[], function() {\r\n\tvar view = Marionette.ItemView.extend({\r\n\t\ttagName: 'div',\r\n\t\ttemplate: '#tmpl-nf-drawer-content-view-changes-item',\r\n\r\n\t\tinitialize: function() {\r\n\t\t\tthis.model.on( 'change:disabled', this.render, this );\r\n\t\t},\r\n\r\n\t\tonBeforeDestroy: function() {\r\n\t\t\tthis.model.off( 'change:disabled', this.render );\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * When we render this element, remove the extra wrapping <div> that backbone creates.\r\n\t\t * \r\n\t\t * @since  3.0\r\n\t\t * @return void\r\n\t\t */\r\n\t\tonRender: function() {\r\n\t\t\tthis.$el = this.$el.children();\r\n\t\t\tthis.$el.unwrap();\r\n\t\t\tthis.setElement( this.$el );\r\n\t\t},\r\n\r\n\t\tevents: {\r\n\t\t\t'click .undoSingle': 'undoSingle'\r\n\t\t},\r\n\r\n\t\tundoSingle: function( e ) {\r\n\t\t\tnfRadio.channel( 'drawer' ).trigger( 'click:undoSingle', this.model );\r\n\t\t}\r\n\t});\r\n\r\n\treturn view;\r\n} );\n","/**\r\n * Changes collection view.\r\n *\r\n * @package Ninja Forms builder\r\n * @subpackage App\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'views/app/drawer/contentViewChanges',['views/app/drawer/contentViewChangesItem'], function( viewChangesItem ) {\r\n\tvar view = Marionette.CollectionView.extend( {\r\n\t\ttagName: 'table',\r\n        className: 'nf-changes',\r\n\t\tchildView: viewChangesItem\r\n\t} );\r\n\r\n\treturn view;\r\n} );\r\n\n","/**\r\n * Handles clicks on the 'view changes' button in the header.\r\n * \r\n * @package Ninja Forms builder\r\n * @subpackage App\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'views/app/drawer/headerViewChanges',[], function() {\r\n\tvar view = Marionette.ItemView.extend({\r\n\t\ttagName: 'div',\r\n\t\ttemplate: '#tmpl-nf-drawer-header-view-changes',\r\n\r\n\t\tevents: {\r\n\t\t\t'click .undoChanges': 'clickUndoChanges'\r\n\t\t},\r\n\r\n\t\tclickUndoChanges: function( e ) {\r\n\t\t\tnfRadio.channel( 'drawer' ).trigger( 'click:undoChanges' );\r\n\t\t}\r\n\t});\r\n\r\n\treturn view;\r\n} );\n","/**\r\n * Error view used for settings.\r\n *\r\n * @package Ninja Forms builder\r\n * @subpackage App\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'views/app/drawer/settingError',[], function() {\r\n\tvar view = Marionette.ItemView.extend({\r\n\t\ttagName: 'div',\r\n\t\ttemplate: '#tmpl-nf-edit-setting-error'\r\n\t});\r\n\r\n\treturn view;\r\n} );\n","define( 'views/app/drawer/itemSetting',['views/app/drawer/mergeTagsContent', 'views/app/drawer/settingError'], function( mergeTagsContentView, settingErrorView ) {\r\n\tvar view = Marionette.LayoutView.extend({\r\n\t\ttagName: 'div',\r\n\t\ttemplate: '#tmpl-nf-edit-setting-wrap',\r\n\r\n\t\tregions: {\r\n\t\t\terror: '.nf-setting-error'\r\n\t\t},\r\n\r\n\t\tinitialize: function( data ) {\r\n\t\t\tthis.dataModel = data.dataModel;\r\n\t\t\t/*\r\n\t\t\t * Send out a request on the setting-type-{type} channel asking if we should render on dataModel change.\r\n\t\t\t * Defaults to false.\r\n\t\t\t * This lets specific settings, like RTEs, say that they don't want to be re-rendered when their data model changes.\r\n\t\t\t */\r\n\t\t\tvar renderOnChange = ( 'undefined' == typeof nfRadio.channel( 'setting-type-' + this.model.get( 'type' ) ).request( 'renderOnChange' ) ) ? false : nfRadio.channel( 'setting-type-' + this.model.get( 'type' ) ).request( 'renderOnChange' );\r\n\t\t\t\r\n\t\t\tif ( renderOnChange ) {\r\n\t\t\t\tthis.dataModel.on( 'change:' + this.model.get( 'name' ), this.render, this );\r\n\t\t\t}\r\n\r\n\t\t\tthis.model.on( 'change:error', this.renderError, this );\r\n\t\t\tthis.model.on( 'change:warning', this.renderWarning, this );\r\n\r\n\t\t\tvar deps = this.model.get( 'deps' );\r\n\t\t\tif ( deps ) {\r\n\t\t\t\tfor ( var name in deps ) {\r\n\t\t\t\t    if ( deps.hasOwnProperty( name ) ) {\r\n\t\t\t\t    \tthis.dataModel.on( 'change:' + name, this.render, this );\r\n\t\t\t\t    }\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n            var remote = this.model.get( 'remote' );\r\n\t\t\tif( remote ) {\r\n\r\n                if( 'undefined' != typeof remote.refresh || remote.refresh ) {\r\n                    // Add 'update' icons\r\n                    var label = this.model.get('label');\r\n                    this.model.set('label', label + ' <a class=\"extra\"><span class=\"dashicons dashicons-update\"></span></a>');\r\n                }\r\n\r\n\t\t\t\tnfRadio.channel( 'setting' ).trigger( 'remote', this.model, this.dataModel, this );\r\n\t\t\t\tthis.model.on( 'rerender', this.render, this );\r\n\t\t\t}\r\n\r\n\t\t\t/*\r\n\t\t\t * When our drawer opens, send out a radio message on our setting type channel.\r\n\t\t\t */\r\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer' ), 'opened', this.drawerOpened );\r\n\r\n\t\t\t/*\r\n\t\t\t * When our drawer closes, send out a radio message on our setting type channel.\r\n\t\t\t */\r\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer' ), 'closed', this.drawerClosed );\r\n\t\t},\r\n\r\n\t\tonBeforeDestroy: function() {\r\n\t\t\tthis.dataModel.off( 'change:' + this.model.get( 'name' ), this.render );\r\n\t\t\tthis.model.off( 'change:error', this.renderError );\r\n\r\n\t\t\tvar deps = this.model.get( 'deps' );\r\n\t\t\tif ( deps ) {\r\n\t\t\t\tfor (var name in deps) {\r\n\t\t\t\t    if ( deps.hasOwnProperty( name ) ) {\r\n\t\t\t\t    \tthis.dataModel.off( 'change:' + name, this.render );\r\n\t\t\t\t    }\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tif( this.model.get( 'remote' ) ) {\r\n\t\t\t\tthis.model.off( 'rerender', this.render, this );\r\n\t\t\t}\r\n\r\n\t\t\t/*\r\n\t\t\t * Send out a radio message.\r\n\t\t\t */\r\n\t\t\tnfRadio.channel( 'setting-' + this.model.get( 'name' ) ).trigger( 'destroy:setting', this.model, this.dataModel, this );\r\n\t\t\tnfRadio.channel( 'setting-type-' + this.model.get( 'type' ) ).trigger( 'destroy:setting', this.model, this.dataModel, this );\r\n\t\t\r\n\t\t\t/*\r\n\t\t\t * Unescape any HTML being saved if we are a textbox.\r\n\t\t\t */\r\n\t\t\tif ( 'textbox' == this.model.get( 'type' ) ) {\r\n\t\t\t\tvar setting = this.model.get( 'name' );\r\n\t\t\t\tvar value = this.dataModel.get( setting );\r\n\t\t\t\tthis.dataModel.set( setting, _.unescape( value ), { silent: true } );\r\n\t\t\t}\r\n\r\n\t\t},\r\n\r\n\t\tonBeforeRender: function() {\r\n\t\t\t/*\r\n\t\t\t * We want to escape any HTML being output if we are a textbox.\r\n\t\t\t */\r\n\t\t\tif ( 'textbox' == this.model.get( 'type' ) ) {\r\n\t\t\t\tvar setting = this.model.get( 'name' );\r\n\t\t\t\tvar value = this.dataModel.get( setting );\r\n\t\t\t\tthis.dataModel.set( setting, _.escape( value ), { silent: true } );\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tnfRadio.channel( 'app' ).trigger( 'before:renderSetting', this.model, this.dataModel );\r\n\t\t\tnfRadio.channel( 'setting-type-' + this.model.get( 'type' ) ).trigger( 'before:renderSetting', this.model, this.dataModel, this );\r\n\t\t\tnfRadio.channel( 'setting-' + this.model.get( 'name' ) ).trigger( 'before:renderSetting', this.model, this.dataModel, this );\r\n\t\t},\r\n\r\n\t\tonRender: function() {\r\n\t\t\tthis.mergeTagsContentView = false;\r\n\t\t\tvar that = this;\r\n\r\n\t\t\t/*\r\n\t\t\t * Send out a radio message.\r\n\t\t\t */\r\n\t\t\tnfRadio.channel( 'setting-' + this.model.get( 'name' ) ).trigger( 'render:setting', this.model, this.dataModel, this );\r\n\t\t\tnfRadio.channel( 'setting-type-' + this.model.get( 'type' ) ).trigger( 'render:setting', this.model, this.dataModel, this );\r\n\r\n\t\t\tjQuery( this.el ).find( '.nf-help' ).each(function() {\r\n\t\t\t\tvar content = jQuery(this).next('.nf-help-text');\r\n\t\t\t\tjQuery( this ).jBox( 'Tooltip', {\r\n\t\t\t\t\tcontent: content,\r\n\t\t\t\t\tmaxWidth: 200,\r\n\t\t\t\t\ttheme: 'TooltipBorder',\r\n\t\t\t\t\ttrigger: 'click',\r\n\t\t\t\t\tcloseOnClick: true\r\n\t\t\t\t})\r\n\t\t    });\r\n\t\t\t\r\n\t\t    if ( this.model.get( 'use_merge_tags' ) ) {\r\n\t\t    \tnfRadio.channel( 'mergeTags' ).request( 'init', this );\r\n\t\t    }\r\n\r\n\t\t\t/*\r\n\t\t\t * Apply Setting Field Masks\r\n\t\t\t */\r\n\t\t\tvar mask = this.model.get( 'mask' );\r\n\r\n\t\t\tif( typeof mask != \"undefined\" ){\r\n\r\n\t\t\t\tvar input = jQuery( this.$el ).find( 'input' );\r\n\r\n\t\t\t\tswitch( mask.type ){\r\n\t\t\t\t\tcase 'numeric':\r\n\t\t\t\t\t\tinput.autoNumeric({\r\n\t\t\t\t\t\t\taSep: thousandsSeparator,\r\n\t\t\t\t\t\t\taDec: decimalPoint\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'currency':\r\n\r\n\t\t\t\t\t\tvar currency = nfRadio.channel( 'settings' ).request( 'get:setting', 'currency' );\r\n\t\t\t\t\t\tvar currencySymbol = nfAdmin.currencySymbols[ currency ] || '';\r\n\r\n\t\t\t\t\t\tinput.autoNumeric({\r\n\t\t\t\t\t\t\taSign:  jQuery('<div />').html(currencySymbol).text(),\r\n\t\t\t\t\t\t\taSep: thousandsSeparator,\r\n\t\t\t\t\t\t\taDec: decimalPoint\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'custom':\r\n\t\t\t\t\t\tif( mask.format ) input.mask( mask.format )\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tdefault:\r\n\t\t\t\t\t\t// TODO: Error Logging.\r\n\t\t\t\t\t\tconsole.log( 'Notice: Mask type of \"' + mask.type + '\" is not supported.' );\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tthis.renderError();\r\n\t\t},\r\n\r\n\t\tonShow: function() {\t\t\t\r\n\t\t\t/*\r\n\t\t\t * Send out a radio message.\r\n\t\t\t */\r\n\t\t\tnfRadio.channel( 'setting-' + this.model.get( 'name' ) ).trigger( 'show:setting', this.model, this.dataModel, this );\r\n\t\t\tnfRadio.channel( 'setting-type-' + this.model.get( 'type' ) ).trigger( 'show:setting', this.model, this.dataModel, this );\r\n\t\t},\r\n\r\n\t\tonAttach: function() {\t\t\t\r\n\t\t\t/*\r\n\t\t\t * Send out a radio message.\r\n\t\t\t */\r\n\t\t\tnfRadio.channel( 'setting-' + this.model.get( 'name' ) ).trigger( 'attach:setting', this.model, this.dataModel, this );\r\n\t\t\tnfRadio.channel( 'setting-type-' + this.model.get( 'type' ) ).trigger( 'attach:setting', this.model, this.dataModel, this );\r\n\t\t},\r\n\r\n\t\trenderError: function() {\r\n\t\t\tif ( this.model.get( 'error' ) ) {\r\n\t\t\t\tjQuery( this.el ).find( '.nf-setting' ).addClass( 'nf-error' );\r\n\t\t\t\tthis.error.show( new settingErrorView( { model: this.model } ) );\r\n\t\t\t} else {\r\n\t\t\t\tjQuery( this.el ).find( '.nf-setting' ).removeClass( 'nf-error' );\r\n\t\t\t\tthis.error.empty();\r\n\t\t\t}\r\n\t\t},\r\n\r\n        renderWarning: function() {\r\n            if ( this.model.get( 'warning' ) ) {\r\n                jQuery( this.el ).find( '.nf-setting' ).addClass( 'nf-warning' );\r\n                this.error.show( new settingErrorView( { model: this.model } ) );\r\n            } else {\r\n                jQuery( this.el ).find( '.nf-setting' ).removeClass( 'nf-warning' );\r\n                this.error.empty();\r\n            }\r\n        },\r\n\r\n\t\ttemplateHelpers: function () {\r\n\t\t\tvar that = this;\r\n\t    \treturn {\r\n\r\n\t    \t\trenderVisible: function() {\r\n\t\t\t\t\tif ( this.deps ) {\r\n\t\t\t\t\t\tfor (var name in this.deps) {\r\n\t\t\t\t\t\t    if ( this.deps.hasOwnProperty( name ) ) {\r\n\t\t\t\t\t\t        if ( that.dataModel.get( name ) != this.deps[ name ] ) {\r\n\t\t\t\t\t\t        \treturn 'style=\"display:none;\"';\r\n\t\t\t\t\t\t        }\r\n\t\t\t\t\t\t    }\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t    \t\t\treturn '';\r\n\t    \t\t},\r\n\r\n\t    \t\trenderSetting: function(){\r\n\t    \t\t\tif ( 'undefined' != typeof that.dataModel.get( this.name ) ) {\r\n\t    \t\t\t\tthis.value = that.dataModel.get( this.name );\r\n\t    \t\t\t} else if ( 'undefined' == typeof this.value ) {\r\n\t    \t\t\t\tthis.value = '';\r\n\t    \t\t\t}\r\n\t    \t\t\tvar setting = nfRadio.channel( 'app' ).request( 'get:template',  '#tmpl-nf-edit-setting-' + this.type );\r\n\t\t\t\t\treturn setting( this );\r\n\t\t\t\t},\r\n\r\n\t\t\t\trenderLabelClasses: function() {\r\n\t\t\t\t\tvar classes = '';\r\n\t\t\t\t\tif ( this.use_merge_tags ) {\r\n\t\t\t\t\t\tclasses += ' has-merge-tags';\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif ( 'rte' == this.type ) {\r\n\t\t\t\t\t\tclasses += ' rte';\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\treturn classes;\r\n\t\t\t\t},\r\n\r\n\t\t\t\trenderClasses: function() {\r\n\t\t\t\t\tvar classes = 'nf-setting ';\r\n\t\t\t\t\tif ( 'undefined' != typeof this.width ) {\r\n\t\t\t\t\t\tclasses += 'nf-' + this.width;\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tclasses += ' nf-one-half';\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif ( this.error ) {\r\n\t\t\t\t\t\tclasses += ' nf-error';\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\treturn classes;\r\n\t\t\t\t},\r\n\r\n\t\t\t\trenderTooltip: function() {\r\n\t\t\t\t\tif ( this.help ) {\r\n\t\t\t\t\t\treturn '<a class=\"nf-help\" href=\"#\" tabindex=\"-1\"><span class=\"dashicons dashicons-admin-comments\"></span></a><div class=\"nf-help-text\">' + this.help + '</div>';\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\treturn '';\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\r\n\t\t\t\trenderMergeTags: function() {\r\n\t\t\t\t\tif ( this.use_merge_tags && ! this.hide_merge_tags ) {\r\n\t\t\t\t\t\treturn '<span class=\"dashicons dashicons-list-view merge-tags\"></span>';\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\treturn '';\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\r\n\t\t\t\trenderPlaceholder: function() {\r\n\t\t\t\t\tif ( this.placeholder ) {\r\n\t\t\t\t\t\treturn 'placeholder=\"' + this.placeholder + '\"';\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\treturn '';\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\tevents: {\r\n\t\t\t'change .setting': 'changeSetting',\r\n\t\t\t'keyup .setting': 'keyUpSetting',\r\n\t\t\t'click .setting': 'clickSetting',\r\n\t\t\t'click .extra': 'clickExtra'\r\n\t\t},\r\n\r\n\t\tchangeSetting: function( e ) {\r\n\t\t\tnfRadio.channel( 'app' ).trigger( 'change:setting', e, this.model, this.dataModel );\r\n\t\t},\r\n\r\n\t\tkeyUpSetting: function( e ) {\r\n\t\t\tnfRadio.channel( 'app' ).trigger( 'keyup:setting', e, this.model, this.dataModel );\r\n\t\t\tnfRadio.channel( 'setting-' + this.model.get( 'name' ) ).trigger( 'keyup:setting', e, this.model, this.dataModel );\r\n\t\t},\r\n\r\n\t\tclickSetting: function( e ) {\r\n\t\t\tnfRadio.channel( 'app' ).trigger( 'click:setting', e, this.model, this.dataModel );\r\n\t\t\tnfRadio.channel( 'setting-type-' + this.model.get( 'type' ) ).trigger( 'click:setting', e, this.model, this.dataModel, this );\r\n\t\t},\r\n\r\n\t\tclickExtra: function( e ) {\r\n\t\t\tnfRadio.channel( 'setting-type-' + this.model.get( 'type' ) ).trigger( 'click:extra', e, this.model, this.dataModel, this );\r\n\t\t\tnfRadio.channel( 'setting-type-' + this.model.get( 'name' ) ).trigger( 'click:extra', e, this.model, this.dataModel, this );\r\n\t\t\tnfRadio.channel( 'setting-name-' + this.model.get( 'name' ) ).trigger( 'click:extra', e, this.model, this.dataModel, this );\r\n\t\t},\r\n\r\n\t\tdrawerOpened: function() {\r\n\t\t\tnfRadio.channel( 'setting-type-' + this.model.get( 'type' ) ).trigger( 'drawer:opened', this.model, this.dataModel, this );\r\n\t\t},\r\n\r\n\t\tdrawerClosed: function() {\r\n\t\t\tnfRadio.channel( 'setting-type-' + this.model.get( 'type' ) ).trigger( 'drawer:closed', this.model, this.dataModel, this );\r\n\t\t}\r\n\t});\r\n\r\n\treturn view;\r\n} );\r\n\n","/**\r\n * Changes collection view.\r\n *\r\n * @package Ninja Forms builder\r\n * @subpackage App\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'views/app/drawer/contentNewForm',['views/app/drawer/itemSetting'], function( itemSettingView) {\r\n\tvar view = Marionette.LayoutView.extend( {\r\n\t\ttagName: 'div',\r\n\t\ttemplate: '#tmpl-nf-drawer-content-new-form',\r\n\r\n\t\tregions: {\r\n\t\t\tformName: '.new-form-name',\r\n\t\t\tformSubmit: '.new-form-submit'\r\n\t\t},\r\n\r\n\t\tonRender: function() {\r\n\t\t\tvar titleSettingModel = nfRadio.channel( 'settings' ).request( 'get:settingModel', 'title' );\r\n\t\t\tvar addSubmitSettingModel = nfRadio.channel( 'settings' ).request( 'get:settingModel', 'add_submit' );\r\n\t\t\tvar dataModel = nfRadio.channel( 'settings' ).request( 'get:settings' );\r\n\t\t\tthis.formName.show( new itemSettingView( { model: titleSettingModel, dataModel: dataModel } ) );\r\n\t\t\t/*\r\n\t\t\t * If we don't have any submit buttons on the form, prompt the user to add one on publish.\r\n\t\t\t */\r\n\t\t\tvar fieldCollection = nfRadio.channel( 'fields' ).request( 'get:collection' );\r\n\t\t\tvar submitButtons = fieldCollection.findWhere( { type: 'submit' } );\r\n\t\t\tif ( 'undefined' == typeof submitButtons ) {\r\n\t\t\t\tthis.formSubmit.show( new itemSettingView( { model: addSubmitSettingModel, dataModel: dataModel } ) );\r\n\t\t\t} else {\r\n\t\t\t\tdataModel.set( 'add_submit', 0 );\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\tevents: {\r\n\t\t\t'click .publish': 'clickPublish'\r\n\t\t},\r\n\r\n\t\tclickPublish: function( e ) {\r\n\t\t\tnfRadio.channel( 'app' ).trigger( 'click:confirmPublish', e );\r\n\t\t}\r\n\t} );\r\n\r\n\treturn view;\r\n} );\r\n\n","/**\r\n * Handles clicks on the 'view changes' button in the header.\r\n * \r\n * @package Ninja Forms builder\r\n * @subpackage App\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'views/app/drawer/headerNewForm',[], function() {\r\n\tvar view = Marionette.ItemView.extend({\r\n\t\ttagName: 'div',\r\n\t\ttemplate: '#tmpl-nf-drawer-header-new-form'\r\n\t});\r\n\r\n\treturn view;\r\n} );\n","/**\r\n * Config file for our app drawers.\r\n *\r\n * this.collection represents all of our registered drawers.\r\n * \r\n * @package Ninja Forms builder\r\n * @subpackage Main App\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'controllers/app/drawerConfig',[\r\n\t'models/app/drawerCollection',\r\n\t'views/fields/drawer/addField',\r\n\t'views/app/drawer/editSettings',\r\n\t'views/app/drawer/headerEditSettings',\r\n\t'views/actions/drawer/addAction',\r\n\t'views/app/drawer/contentViewChanges',\r\n\t'views/app/drawer/headerViewChanges',\r\n\t'views/app/drawer/contentNewForm',\r\n\t'views/app/drawer/headerNewForm'\r\n\t], function(\r\n\t\tdrawerCollection,\r\n\t\taddFieldView,\r\n\t\teditSettingsView,\r\n\t\teditSettingsHeaderView,\r\n\t\taddActionView,\r\n\t\tviewChangesView,\r\n\t\tviewChangesHeaderView,\r\n\t\tnewFormView,\r\n\t\tnewFormHeaderView,\r\n\t\tmobileItemControlsView\r\n\t) {\r\n\tvar controller = Marionette.Object.extend( {\r\n\t\tinitialize: function() {\r\n\r\n\t\t\tthis.collection = new drawerCollection( [\r\n\t\t\t\t{\r\n\t\t\t\t\tid: 'addField',\r\n\r\n\t\t\t\t\tgetContentView: function( data ) {\r\n\t\t\t\t\t\treturn new addFieldView( data );\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\tid: 'addAction',\r\n\r\n\t\t\t\t\tgetContentView: function( data ) {\r\n\t\t\t\t\t\treturn new addActionView( data );\r\n\t\t\t\t\t}\r\n\t\t\t\t},\t\t\t\t\r\n\t\t\t\t{\r\n\t\t\t\t\tid: 'editSettings',\r\n\r\n\t\t\t\t\t/*\r\n\t\t\t\t\t * TODO: Add filtering when editing settings. For now, removing them from settings.\r\n\t\t\t\t\t */\r\n\t\t\t\t\tgetHeaderView: function( data ) {\r\n\t\t\t\t\t\t/*\r\n\t\t\t\t\t\t * Get a custom setting header view if one is set.\r\n\t\t\t\t\t\t * TODO: Currently, this only works for advanced settings.\r\n\t\t\t\t\t\t * This could be used to replace the need for a single config file.\r\n\t\t\t\t\t\t */\r\n\t\t\t\t\t\tif ( 'undefined' != typeof data.typeModel ) {\r\n\t\t\t\t\t\t\tvar view = nfRadio.channel( data.typeModel.get( 'id' ) ).request( 'get:drawerHeaderView' ) || editSettingsHeaderView;\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tvar view = editSettingsHeaderView;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\treturn new view( data );\r\n\t\t\t\t\t},\r\n\r\n\t\t\t\t\tgetContentView: function( data ) {\r\n\t\t\t\t\t\treturn new editSettingsView( data );\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\tid: 'viewChanges',\r\n\r\n\t\t\t\t\t// getHeaderView() is defined by default, but we need to override it for the viewChanges drawer.\r\n\t\t\t\t\tgetHeaderView: function( data ) {\r\n\t\t\t\t\t\treturn new viewChangesHeaderView( data );\r\n\t\t\t\t\t},\r\n\r\n\t\t\t\t\tgetContentView: function( data ) {\r\n\t\t\t\t\t\treturn new viewChangesView( data );\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\tid: 'newForm',\r\n\r\n\t\t\t\t\t// getHeaderView() is defined by default, but we need to override it for the newForm drawer.\r\n\t\t\t\t\tgetHeaderView: function( data ) {\r\n\t\t\t\t\t\treturn new newFormHeaderView( data );\r\n\t\t\t\t\t},\r\n\r\n\t\t\t\t\tgetContentView: function( data ) {\r\n\t\t\t\t\t\treturn new newFormView( data );\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t] );\r\n\r\n\t\t\t// Listen for requests for our drawer collection.\r\n\t\t\tnfRadio.channel( 'app' ).reply( 'get:drawerCollection', this.getDrawerCollection, this );\r\n\t\t\t// Listen for requests for specific drawer models.\r\n\t\t\tnfRadio.channel( 'app' ).reply( 'get:drawer', this.getDrawer, this );\r\n\t\t},\r\n\r\n\t\tgetDrawerCollection: function() {\r\n\t\t\treturn this.collection;\r\n\t\t},\r\n\r\n\t\tgetDrawer: function( id ) {\r\n\t\t\treturn this.collection.get( id );\r\n\t\t}\r\n\r\n\t});\r\n\r\n\treturn controller;\r\n} );\n","/**\r\n * Default settings title view.\r\n * \r\n * @package Ninja Forms builder\r\n * @subpackage App\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'views/app/drawer/defaultSettingsTitle',[], function() {\r\n\tvar view = Marionette.ItemView.extend({\r\n\t\ttagName: 'div',\r\n\t\ttemplate: '#tmpl-nf-drawer-content-edit-settings-title-default',\r\n\r\n\t\ttemplateHelpers: function () {\r\n\t    \treturn {\r\n\t    \t\trenderTypeNicename: function() {\r\n\t    \t\t\tvar currentDomain = nfRadio.channel( 'app' ).request( 'get:currentDomain' );\r\n\t\t\t\t\tvar domainID = currentDomain.get( 'id' );\r\n\t    \t\t\tvar type = nfRadio.channel( domainID ).request( 'get:type', this.type );\r\n\t    \t\t\tif ( 'undefined' != typeof type ) {\r\n\t    \t\t\t\treturn type.get( 'nicename' );\r\n\t    \t\t\t} else {\r\n\t    \t\t\t\treturn '';\r\n\t    \t\t\t}\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t},\r\n\t});\r\n\r\n\treturn view;\r\n} );\n","/**\r\n * Empty view.\r\n *\r\n * @package Ninja Forms builder\r\n * @subpackage App\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'views/app/empty',[], function() {\r\n\tvar view = Marionette.ItemView.extend({\r\n\t\ttagName: 'div',\r\n\t\ttemplate: '#tmpl-nf-empty'\r\n\t});\r\n\r\n\treturn view;\r\n} );\n","/**\r\n * Model for our individual domains.\r\n * \r\n * @package Ninja Forms builder\r\n * @subpackage Fields\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'models/app/domainModel',[ 'views/app/drawer/defaultSettingsTitle', 'views/app/empty' ], function( DefaultSettingsTitleView, EmptyView ) {\r\n\tvar model = Backbone.Model.extend( {\r\n\t\tdefaults: {\r\n\t\t\tdashicons: '',\r\n\t\t\tclasses: '',\r\n\t\t\tactive: false,\r\n\t\t\turl: '',\r\n\t\t\thotkeys: false,\r\n\t\t\tdisabled: false,\r\n\r\n\t\t\tgetSettingsTitleView: function( data ) {\r\n\t\t\t\treturn new DefaultSettingsTitleView( data );\r\n\t\t\t},\r\n\r\n\t\t\tgetDefaultSettingsTitleView: function( data ) {\r\n\t\t\t\treturn new DefaultSettingsTitleView( data );\r\n\t\t\t},\r\n\r\n\t\t\tgetGutterLeftView: function( data ) {\r\n\t\t\t\t/*\r\n\t\t\t\t * Return empty view\r\n\t\t\t\t */\r\n\t\t\t\treturn new EmptyView();\r\n\t\t\t},\r\n\r\n\t\t\tgetGutterRightView: function( data ) {\r\n\t\t\t\t/* \r\n\t\t\t\t * Return empty view\r\n\t\t\t\t */\r\n\t\t\t\treturn new EmptyView();\r\n\t\t\t}\r\n\t\t}\r\n\t} );\r\n\t\r\n\treturn model;\r\n} );\n","/**\r\n * Holds all of our domain models.\r\n * \r\n * @package Ninja Forms builder\r\n * @subpackage Fields\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'models/app/domainCollection',['models/app/domainModel'], function( domainModel ) {\r\n\tvar collection = Backbone.Collection.extend( {\r\n\t\tmodel: domainModel\r\n\t} );\r\n\treturn collection;\r\n} );\n","define( 'views/fields/subHeader',[], function() {\r\n\tvar view = Marionette.ItemView.extend({\r\n\t\ttagName: 'div',\r\n\t\ttemplate: '#tmpl-nf-sub-header-fields'\r\n\t});\r\n\r\n\treturn view;\r\n} );\n","define( 'views/fields/mainContentFieldCollection',[], function() {\r\n\tvar view = Marionette.CollectionView.extend( {\r\n\t\ttagName: 'div',\r\n\t\treorderOnSort: true,\r\n\r\n\t\tgetChildView: function() {\r\n\t\t\treturn nfRadio.channel( 'views' ).request( 'get:fieldItem' );\r\n\t\t},\r\n\r\n\t\tgetEmptyView: function() {\r\n\t\t\treturn nfRadio.channel( 'views' ).request( 'get:mainContentEmpty' );\r\n\t\t},\r\n\r\n\t\tinitialize: function() {\r\n\t\t\tnfRadio.channel( 'fields' ).reply( 'get:sortableEl', this.getSortableEl, this );\r\n\t\t\tnfRadio.channel( 'fields' ).reply( 'init:sortable', this.initSortable, this );\r\n\t\t\tnfRadio.channel( 'fields' ).reply( 'destroy:sortable', this.destroySortable, this );\r\n\t\t},\r\n\r\n\t\tonRender: function() {\r\n\t\t\tif ( this.collection.models.length > 0 ) {\r\n\t\t\t\tjQuery( this.el ).addClass( 'nf-field-type-droppable' ).addClass( 'nf-fields-sortable' );\r\n\t\t\t\tvar that = this;\r\n\t\t\t\t/* TODO: There's a bug with some Android phones and chrome. The fix below hasn't been implement.\r\n\r\n\t\t\t\t * Instantiate our sortable field list, but only if we aren't on a mobile device.\r\n\t\t\t\t *\r\n\t\t\t\t * On Android, our sortable list isn't scrollable if it's instantiated at render.\r\n\t\t\t\t * Instead, for mobile, we need to instantiate our sortable when the user tapholds and then\r\n\t\t\t\t * destroy it when the drag stops.\r\n\t\t\t\t */\r\n\t\t\t\t// if ( ! nfRadio.channel( 'app' ).request( 'is:mobile' ) ) {\r\n\t\t\t\t\tthis.initSortable();\r\n\t\t\t\t// }\r\n\t\t\t}\r\n\t\t\tnfRadio.channel( 'app' ).trigger( 'render:fieldsSortable', this );\r\n\t\t},\r\n\r\n\t\tgetSortableEl: function() {\r\n\t\t\treturn this.el;\r\n\t\t},\r\n\r\n\t\tinitSortable: function() {\r\n\t\t\tif ( nfRadio.channel( 'app' ).request( 'is:mobile' ) ) {\r\n\t\t\t\tvar tolerance = 'pointer';\r\n\t\t\t} else {\r\n\t\t\t\tvar tolerance = 'intersect';\r\n\t\t\t}\r\n\r\n\t\t\tjQuery( this.el ).sortable( {\r\n\t\t\t\t//containment: '#nf-main',\r\n\t\t\t\thelper: 'clone',\r\n\t\t\t\tcancel: '.nf-item-controls',\r\n\t\t\t\tplaceholder: 'nf-fields-sortable-placeholder',\r\n\t\t\t\topacity: 0.95,\r\n\t\t\t\tgrid: [ 5, 5 ],\r\n\t\t\t\t// scroll: false,\r\n\t\t\t\tappendTo: '#nf-main',\r\n\t\t\t\tscrollSensitivity: 10,\r\n\r\n\t\t\t\treceive: function( e, ui ) {\r\n\t\t\t\t\tif ( ui.item.dropping ) return;\r\n\t\t\t\t\tnfRadio.channel( 'app' ).request( 'receive:fieldsSortable', ui );\r\n\t\t\t\t},\r\n\r\n\t\t\t\tover: function( e, ui ) {\r\n\t\t\t\t\tif ( ui.item.dropping ) return;\r\n\t\t\t\t\tnfRadio.channel( 'app' ).request( 'over:fieldsSortable', ui );\r\n\t\t\t\t},\r\n\r\n\t\t\t\tout: function( e, ui ) {\r\n\t\t\t\t\tif ( ui.item.dropping ) return;\r\n\t\t\t\t\tnfRadio.channel( 'app' ).request( 'out:fieldsSortable', ui );\r\n\t\t\t\t},\r\n\r\n\t\t\t\tstart: function( e, ui ) {\r\n\t\t\t\t\tif ( ui.item.dropping ) return;\r\n\t\t\t\t\tnfRadio.channel( 'app' ).request( 'start:fieldsSortable', ui );\r\n\t\t\t\t},\r\n\r\n\t\t\t\tupdate: function( e, ui ) {\r\n\t\t\t\t\tif ( ui.item.dropping ) return;\r\n\t\t\t\t\tnfRadio.channel( 'app' ).request( 'update:fieldsSortable', ui, this );\r\n\t\t\t\t},\r\n\r\n\t\t\t\tstop: function( e, ui ) {\r\n\t\t\t\t\tif ( ui.item.dropping ) return;\r\n\t\t\t\t\tnfRadio.channel( 'app' ).request( 'stop:fieldsSortable', ui );\r\n\t\t\t\t}\r\n\t\t\t} );\r\n\t\t},\r\n\r\n\t\tdestroySortable: function() {\r\n\t\t\tjQuery( this.el ).sortable( 'destroy' );\r\n\t\t},\r\n\r\n\t\tonAddChild: function( childView ) {\r\n\t\t\tif ( nfRadio.channel( 'fields' ).request( 'get:adding' ) ) {\r\n\t\t\t\tchildView.$el.hide().show( 'clip' );\r\n\t\t\t\tnfRadio.channel( 'fields' ).request( 'set:adding', false );\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t} );\r\n\r\n\treturn view;\r\n} );\r\n\n","define( 'views/fields/drawer/addSavedField',[], function() {\r\n\tvar view = Marionette.ItemView.extend({\r\n\t\ttagName: 'div',\r\n\t\ttemplate: '#tmpl-nf-add-saved-field',\r\n\r\n\t\tinitialize: function() {\r\n\t\t\tthis.model.on( 'change:addSavedLoading', this.renderAddButton, this );\r\n\t\t},\r\n\r\n\t\tonRender: function() {\r\n\t\t\tthis.renderAddButton();\r\n\t\t},\r\n\r\n\t\trenderAddButton: function() {\r\n\t\t\tif ( this.model.get( 'addSavedLoading' ) ) {\r\n\t\t\t\tvar button = nfRadio.channel( 'app' ).request( 'get:template',  '#tmpl-nf-add-saved-field-loading' );\r\n\t\t\t} else {\r\n\t\t\t\tvar button = nfRadio.channel( 'app' ).request( 'get:template',  '#tmpl-nf-add-saved-field-button' );\r\n\t\t\t}\r\n\t\t\tjQuery( this.el ).find( '.add-button' ).html( button( this ) );\r\n\t\t},\r\n\r\n\t\tonBeforeDestroy: function() {\r\n\t\t\tthis.model.off( 'change:addSavedLoading', this.render );\r\n\t\t},\r\n\r\n\t\tevents: {\r\n\t\t\t'click .nf-button': 'clickAddSavedField'\r\n\t\t},\r\n\r\n\t\tclickAddSavedField: function( e ) {\r\n\t\t\tnfRadio.channel( 'drawer' ).trigger( 'click:addSavedField', e, this.model );\r\n\t\t}\r\n\t});\r\n\r\n\treturn view;\r\n} );\r\n\n","/**\r\n * Fields settings title view.\r\n * \r\n * @package Ninja Forms builder\r\n * @subpackage Fields\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'views/fields/drawer/settingsTitle',['views/fields/drawer/addSavedField'], function( addSavedFieldView ) {\r\n\tvar view = Marionette.LayoutView.extend({\r\n\t\ttagName: 'div',\r\n\t\ttemplate: '#tmpl-nf-drawer-content-edit-settings-title-fields',\r\n\r\n\t\tinitialize: function() {\r\n\t\t\tthis.model.on( 'change:saved', this.render, this );\r\n\t\t\tthis.model.on( 'change:label', this.renderjBoxContent, this );\r\n\t\t},\r\n\r\n\t\tregions: {\r\n\t\t\taddSaved: '.nf-add-saved-field'\r\n\t\t},\r\n\r\n\t\tonBeforeDestroy: function() {\r\n\t\t\tthis.model.off( 'change:saved', this.render );\r\n\t\t\tthis.addSavedjBox.destroy();\r\n\t\t\tthis.model.unset( 'jBox', { silent: true } );\r\n\t\t},\r\n\r\n\t\tonRender: function() {\r\n\t\t\tthis.renderjBoxContent();\r\n\t\t\tvar that = this;\r\n\t\t\tthis.addSavedjBox = new jBox( 'Tooltip', {\r\n\t\t\t\ttrigger: 'click',\r\n\t\t\t\ttitle: 'Add to Saved Fields',\r\n\t\t\t\tposition: {\r\n\t\t\t\t\tx:'left',\r\n\t\t\t\t\ty:'center'\r\n\t\t\t\t},\r\n\t\t\t\toutside:'x',\r\n\t\t\t\tcloseOnClick: 'body',\r\n\r\n\t\t\t\tonCreated: function() {\r\n\t\t\t\t\tthis.setContent( jQuery( that.el ).find( '.nf-add-saved-field' ) );\r\n\t\t\t\t}\r\n\t\t\t} );\r\n\t\t\tthis.addSavedjBox.attach( jQuery( this.el ).find( '.dashicons') );\r\n\t\t\tthis.model.set( 'jBox', this.addSavedjBox, { silent: true } );\r\n\t\t},\r\n\r\n\t\trenderjBoxContent: function() {\r\n\t\t\tif ( this.addSaved ) {\r\n\t\t\t\tthis.addSaved.show( new addSavedFieldView( { model: this.model } ) );\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\ttemplateHelpers: function () {\r\n\t    \treturn {\r\n\t    \t\trenderTypeNicename: function() {\r\n\t    \t\t\tvar currentDomain = nfRadio.channel( 'app' ).request( 'get:currentDomain' );\r\n\t\t\t\t\tvar domainID = currentDomain.get( 'id' );\r\n\t    \t\t\tvar type = nfRadio.channel( domainID ).request( 'get:type', this.type );\r\n\t    \t\t\tvar displayName = type.get( 'nicename' );\r\n\r\n\t    \t\t\tif ( this.saved ) {\r\n\t    \t\t\t\tvar realType = nfRadio.channel( domainID ).request( 'get:type', type.get( 'type' ) );\r\n\t    \t\t\t\tdisplayName += ' - ' + realType.get( 'nicename' );\r\n\t    \t\t\t}\r\n\t    \t\t\treturn displayName;\r\n\t\t\t\t},\r\n\t\t\t\t\r\n\t\t\t\trenderSavedStar: function() {\r\n\t\t\t\t\tif ( this.saved ) {\r\n\t\t\t\t\t\tvar star = 'filled';\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tvar star = 'empty';\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn '<span class=\"dashicons dashicons-star-' + star + '\"></span>'\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t}\r\n\t});\r\n\r\n\treturn view;\r\n} );\n","/**\r\n * Add main header.\r\n *\r\n * TODO: make dynamic\r\n * \r\n * @package Ninja Forms builder\r\n * @subpackage Actions\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'views/actions/mainHeader',[], function() {\r\n\tvar view = Marionette.ItemView.extend({\r\n\t\ttagName: 'div',\r\n\t\ttemplate: '#tmpl-nf-main-header-actions',\r\n\r\n\t\tinitialize: function() {\r\n\t\t\tvar actionCollection = nfRadio.channel( 'actions' ).request( 'get:collection' );\r\n\t\t\tthis.listenTo( actionCollection, 'add', this.render );\r\n\t\t\tthis.listenTo( actionCollection, 'remove', this.render );\r\n\t\t},\r\n\r\n\t\tonRender: function() {\r\n\t\t\tvar actionCollection = nfRadio.channel( 'actions' ).request( 'get:collection' );\r\n\t\t\tif ( actionCollection.models.length == 0 ) {\r\n\t\t\t\tjQuery( this.el ).hide();\r\n\t\t\t} else {\r\n\t\t\t\tjQuery( this.el ).show();\r\n\t\t\t}\r\n\t\t}\r\n\t});\r\n\r\n\treturn view;\r\n} );\n","/**\r\n * Actions subheader view.\r\n *\r\n * TODO: make dynamic\r\n * \r\n * @package Ninja Forms builder\r\n * @subpackage Actions\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'views/actions/subHeader',[], function() {\r\n\tvar view = Marionette.ItemView.extend({\r\n\t\ttagName: 'div',\r\n\t\ttemplate: '#tmpl-nf-sub-header-actions'\r\n\t});\r\n\r\n\treturn view;\r\n} );\n","/**\r\n * Renders an application menu item from a domain model.\r\n *\r\n * @package Ninja Forms builder\r\n * @subpackage App\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'views/app/itemControls',[], function() {\r\n\tvar view = Marionette.ItemView.extend({\r\n\t\ttagName: 'div',\r\n\t\ttemplate: '#tmpl-nf-item-controls',\r\n\r\n\t\tinitialize: function() {\r\n\t\t\t// Listen for domain changes and re-render when we detect one.\r\n\t\t\t// this.listenTo( nfRadio.channel( 'app' ), 'change:currentDomain', this.render );\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * When we render this view, remove the extra <div> tag created by backbone.\r\n\t\t * \r\n\t\t * @since  3.0\r\n\t\t * @return void\r\n\t\t */\r\n\t\tonRender: function() {\r\n\t\t\t// this.$el = this.$el.children();\r\n\t\t\t// this.$el.unwrap();\r\n\t\t\t// this.setElement( this.$el );\r\n\t\t\t// \r\n\t\t\tthis.currentDomain = nfRadio.channel( 'app' ).request( 'get:currentDomain' );\r\n\t\t},\r\n\r\n\t\tevents: {\r\n\t\t\t'mouseover .nf-item-control': 'mouseoverItemControl',\r\n\t\t\t'click .nf-edit-settings': 'clickEdit',\r\n\t\t\t'singletap .nf-item-control': 'singleTapEdit',\r\n\t\t\t'click .nf-item-delete': 'clickDelete',\r\n\t\t\t'click .nf-item-duplicate': 'clickDuplicateField'\r\n\t\t},\r\n\r\n\t\tclickEdit: function( e ) {\r\n\t\t\tif ( ! nfRadio.channel( 'app' ).request( 'is:mobile' ) ) {\r\n\t\t\t\tnfRadio.channel( 'app' ).trigger( 'click:edit', e, this.model );\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\tsingleTapEdit: function( e ) {\r\n\t\t\tnfRadio.channel( 'app' ).trigger( 'click:edit', e, this.model );\r\n\t\t},\r\n\r\n\t\tclickDelete: function( e ) {\r\n\t\t\tnfRadio.channel( 'app' ).trigger( 'click:delete', e, this.model );\r\n\t\t},\r\n\r\n\t\tclickDuplicateField: function( e ) {\r\n\t\t\tnfRadio.channel( 'app' ).trigger( 'click:duplicate', e, this.model );\r\n\t\t},\r\n\r\n\t\tmouseoverItemControl: function( e ) {\r\n\t\t\tnfRadio.channel( 'app' ).trigger( 'mouseover:itemControl', e, this.model );\r\n\t\t}\r\n\t});\r\n\r\n\treturn view;\r\n} );\n","/**\r\n * Single action table row\r\n *\r\n * TODO: make dynamic\r\n *\r\n * @package Ninja Forms builder\r\n * @subpackage Actions\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'views/actions/actionItem',['views/app/itemControls'], function( itemControlsView ) {\r\n\tvar view = Marionette.LayoutView.extend({\r\n\t\ttagName: 'tr',\r\n\t\ttemplate: '#tmpl-nf-action-item',\r\n\r\n\t\tregions: {\r\n\t\t\titemControls: '.nf-item-controls'\r\n\t\t},\r\n\r\n\t\tinitialize: function() {\r\n\t\t\tthis.template = nfRadio.channel( 'actions' ).request( 'get:actionItemTemplate' ) || this.template;\r\n\t\t\tthis.model.on( 'change:label', this.render, this );\r\n\t\t\tthis.model.on( 'change:editActive', this.render, this );\r\n\t\t\tthis.model.on( 'change:active', this.maybeDeactivate, this );\r\n\t\t},\r\n\r\n\t\tonBeforeDestroy: function() {\r\n\t\t\tthis.model.off( 'change:label', this.render );\r\n\t\t\tthis.model.off( 'change:editActive', this.render );\r\n\t\t\tthis.model.off( 'change:active', this.maybeDeactivate );\r\n\t\t},\r\n\r\n\t\tonRender: function() {\r\n\t\t\tif ( this.model.get( 'editActive' ) ) {\r\n\t\t\t\tjQuery( this.el ).addClass( 'active' );\r\n\t\t\t} else {\r\n\t\t\t\tjQuery( this.el ).removeClass( 'active' );\r\n\t\t\t}\r\n\r\n\t\t\tthis.maybeDeactivate();\r\n\r\n\t\t\tthis.itemControls.show( new itemControlsView( { model: this.model } ) );\r\n\t\t},\r\n\r\n\t\tmaybeDeactivate: function() {\r\n\t\t\tif ( 0 == this.model.get( 'active' ) ) {\r\n\t\t\t\tjQuery( this.el ).addClass( 'deactivated' );\r\n\t\t\t} else {\r\n\t\t\t\tjQuery( this.el ).removeClass( 'deactivated' );\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\tevents: {\r\n\t\t\t'change input': 'changeToggle',\r\n\t\t\t'click': 'maybeClickEdit'\r\n\t\t},\r\n\r\n\t\tmaybeClickEdit: function( e ) {\r\n\t\t\tif ( 'TR' == jQuery( e.target ).parent().prop( 'tagName' ) ) {\r\n\t\t\t\tnfRadio.channel( 'app' ).trigger( 'click:edit', e, this.model );\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\tchangeToggle: function( e ) {\r\n\t\t\tvar setting = jQuery( e.target ).data( 'setting' );\r\n\t\t\tvar settingModel = nfRadio.channel( 'actions' ).request( 'get:settingModel', setting );\r\n\t\t\tconsole.log( settingModel );\r\n\t\t\tconsole.log( this.model );\r\n\t\t\tnfRadio.channel( 'app' ).request( 'change:setting', e, settingModel, this.model );\r\n\t\t\tnfRadio.channel( 'app' ).request( 'update:db' );\r\n\t\t},\r\n\r\n\t\ttemplateHelpers: function() {\r\n\t\t\treturn {\r\n\t\t\t\trenderToggle: function( settingName ) {\r\n\t\t\t\t\tthis.settingName = settingName || 'active';\r\n\t\t\t\t\tvar actionLabel = this.label;\r\n\t\t\t\t\tthis.label = '';\r\n\t\t\t\t\tthis.value = this[ this.settingName ];\r\n\t\t\t\t\tthis.name = this.id + '-' + this.settingName;\r\n\t\t\t\t\tvar html = nfRadio.channel( 'app' ).request( 'get:template',  '#tmpl-nf-edit-setting-toggle' );\r\n\t\t\t\t\thtml = html( this );\r\n\t\t\t\t\tthis.label = actionLabel;\r\n\t\t\t\t\treturn html;\r\n\t\t\t\t},\r\n\r\n\t\t\t\trenderTypeNicename: function() {\r\n\t\t\t\t\tvar type = nfRadio.channel( 'actions' ).request( 'get:type', this.type );\r\n\t\t\t\t\tif ( 'undefined' == typeof type ) return;\r\n\r\n\t\t\t\t\treturn type.get( 'nicename' );\r\n\t\t\t\t},\r\n\r\n\t\t\t\trenderTooltip: function() {\r\n\t\t\t\t\tif ( this.help ) {\r\n\t\t\t\t\t\treturn '<a class=\"nf-help\" href=\"#\" tabindex=\"-1\"><span class=\"dashicons dashicons-admin-comments\"></span></a><div class=\"nf-help-text\">' + this.help + '</div>';\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\treturn '';\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\r\n\t\t\t\trenderMergeTags: function() {\r\n\t\t\t\t\tif ( this.use_merge_tags ) {\r\n\t\t\t\t\t\treturn '<span class=\"dashicons dashicons-list-view merge-tags\"></span>';\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\treturn '';\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t});\r\n\r\n\treturn view;\r\n} );\r\n\n","define( 'views/actions/mainContentEmpty',[], function() {\r\n\tvar view = Marionette.ItemView.extend({\r\n\t\ttagName: 'div',\r\n\t\ttemplate: '#tmpl-nf-main-content-actions-empty',\r\n\r\n\t\tonBeforeDestroy: function() {\r\n\t\t\tjQuery( this.el ).parent().parent().removeClass( 'nf-actions-empty' );\r\n\t\t\t// jQuery( this.el ).parent().removeClass( 'nf-fields-empty-droppable' ).droppable( 'destroy' );\r\n\t\t},\r\n\r\n\t\tonRender: function() {\r\n\t\t\tthis.$el = this.$el.children();\r\n\t\t\tthis.$el.unwrap();\r\n\t\t\tthis.setElement( this.$el );\r\n\t\t},\r\n\r\n\t\tonShow: function() {\r\n\t\t\tjQuery( this.el ).parent().parent().addClass( 'nf-actions-empty' );\r\n\t\t\t// if ( jQuery( this.el ).parent().hasClass( 'ui-sortable' ) ) {\r\n\t\t\t// \tjQuery( this.el ).parent().sortable( 'destroy' );\r\n\t\t\t// }\r\n\t\t\t// jQuery( this.el ).parent().addClass( 'nf-fields-empty-droppable' );\r\n\t\t\t// jQuery( this.el ).parent().droppable( {\r\n\t\t\t// \taccept: function( draggable ) {\r\n\t\t\t// \t\tif ( jQuery( draggable ).hasClass( 'nf-stage' ) || jQuery( draggable ).hasClass( 'nf-field-type-button' ) ) {\r\n\t\t\t// \t\t\treturn true;\r\n\t\t\t// \t\t}\r\n\t\t\t// \t},\r\n\t\t\t// \thoverClass: 'nf-droppable-hover',\r\n\t\t\t// \ttolerance: 'pointer',\r\n\t\t\t// \tover: function( e, ui ) {\r\n\t\t\t// \t\tui.item = ui.draggable;\r\n\t\t\t// \t\tnfRadio.channel( 'app' ).request( 'over:fieldsSortable', ui );\r\n\t\t\t// \t},\r\n\t\t\t// \tout: function( e, ui ) {\r\n\t\t\t// \t\tui.item = ui.draggable;\r\n\t\t\t// \t\tnfRadio.channel( 'app' ).request( 'out:fieldsSortable', ui );\r\n\t\t\t// \t},\r\n\t\t\t// \tdrop: function( e, ui ) {\r\n\t\t\t// \t\tui.item = ui.draggable;\r\n\t\t\t// \t\tnfRadio.channel( 'app' ).request( 'receive:fieldsSortable', ui );\r\n\t\t\t// \t\tvar fieldCollection = nfRadio.channel( 'fields' ).request( 'get:collection' );\r\n\t\t\t// \t\tfieldCollection.trigger( 'reset', fieldCollection );\r\n\t\t\t// \t},\r\n\t\t\t// } );\r\n\t\t}\r\n\t});\r\n\r\n\treturn view;\r\n} );\n","/**\r\n * Main content view for our actions.\r\n *\r\n * TODO: make dynamic\r\n *\r\n * @package Ninja Forms builder\r\n * @subpackage Actions\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'views/actions/mainContent',['views/actions/actionItem', 'views/actions/mainContentEmpty'], function( actionView, emptyView ) {\r\n\tvar view = Marionette.CompositeView.extend({\r\n\t\ttemplate: '#tmpl-nf-action-table',\r\n\t\tchildView: actionView,\r\n\t\temptyView: emptyView,\r\n\r\n\t\tinitialize: function() {\r\n\t\t\tthis.template = nfRadio.channel( 'actions' ).request( 'get:mainContentTemplate' ) || this.template;\r\n\t\t},\r\n\r\n\t\tonRender: function() {\r\n\t\t\tjQuery( this.el ).droppable( {\r\n\t\t\t\taccept: '.nf-action-type-draggable',\r\n\t\t\t\tactiveClass: 'nf-droppable-active',\r\n\t\t\t\thoverClass: 'nf-droppable-hover',\r\n\t\t\t\tdrop: function( e, ui ) {\r\n\t\t\t\t\tnfRadio.channel( 'app' ).request( 'drop:actionType', e, ui );\r\n\t\t\t\t}\r\n\t\t\t} );\r\n\t\t},\r\n\r\n\t\tattachHtml: function( collectionView, childView ) {\r\n\t\t\tif ( 'undefined' == typeof nfRadio.channel( 'actions' ).request( 'get:type', childView.model.get( 'type' ) ) ) return;\r\n\r\n\t\t\tjQuery( collectionView.el ).find( 'tbody' ).append( childView.el );\r\n\t\t},\r\n\t});\r\n\r\n\treturn view;\r\n} );\r\n\n","define( 'views/advanced/mainHeader',[], function() {\r\n\tvar view = Marionette.ItemView.extend({\r\n\t\ttagName: 'div',\r\n\t\ttemplate: '#tmpl-nf-main-header-settings'\r\n\t});\r\n\r\n\treturn view;\r\n} );\n","define( 'views/advanced/subHeader',[], function() {\r\n\tvar view = Marionette.ItemView.extend({\r\n\t\ttagName: 'div',\r\n\t\ttemplate: '#tmpl-nf-sub-header-settings'\r\n\t});\r\n\r\n\treturn view;\r\n} );\n","define( 'views/advanced/settingItem',[], function() {\r\n\tvar view = Marionette.ItemView.extend({\r\n\t\ttagName: 'div',\r\n\t\ttemplate: '#tmpl-nf-form-setting-type',\r\n\r\n\t\tonBeforeDestroy: function() {\r\n\t\t\tthis.model.off( 'change:editActive', this.updateActiveClass );\r\n\t\t},\r\n\r\n\t\tinitialize: function() {\r\n\t\t\tthis.model.on( 'change:editActive', this.updateActiveClass, this );\r\n\t\t},\r\n\r\n\t\tevents: {\r\n\t\t\t'click': 'clickEdit'\r\n\t\t},\r\n\r\n\t\tclickEdit: function( e ) {\r\n\t\t\tnfRadio.channel( 'settings' ).trigger( 'click:edit', e, this.model );\r\n\t\t},\r\n\r\n\t\ttemplateHelpers: function() {\r\n\t\t\treturn {\r\n\t\t\t\trenderClasses: function() {\r\n\t\t\t\t\tvar classes = 'nf-setting-wrap ' + this.id;\r\n\t    \t\t\tif ( this.editActive ) {\r\n\t    \t\t\t\tclasses += ' active';\r\n\t    \t\t\t}\r\n\t    \t\t\treturn classes;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\tupdateActiveClass: function() {\r\n\t\t\tif ( this.model.get( 'editActive' ) ) {\r\n\t\t\t\tjQuery( this.el ).find( '.nf-setting-wrap' ).addClass( 'active' );\r\n\t\t\t} else {\r\n\t\t\t\tjQuery( this.el ).find( '.nf-setting-wrap' ).removeClass( 'active' );\r\n\t\t\t}\r\n\t\t}\r\n\t});\r\n\r\n\treturn view;\r\n} );\n","define( 'views/advanced/mainContent',['views/advanced/settingItem'], function( settingItem ) {\r\n\tvar view = Marionette.CollectionView.extend({\r\n\t\tchildView: settingItem\r\n\t\t\r\n\t});\r\n\r\n\treturn view;\r\n} );\n","/**\r\n * Model that represents our form fields.\r\n * \r\n * @package Ninja Forms builder\r\n * @subpackage Fields\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'models/fields/fieldModel',[], function() {\r\n\tvar model = Backbone.Model.extend( {\r\n\t\tdefaults: {\r\n\t\t\tobjectType: 'Field',\r\n\t\t\tobjectDomain: 'fields',\r\n\t\t\teditActive: false,\r\n\t\t\torder: 999\r\n\t\t},\r\n\r\n\t\tinitialize: function() {\r\n\t\t\tif ( 'undefined' == typeof this.get( 'type' ) ) return;\r\n\r\n\t\t\t// Listen for model attribute changes\r\n\t\t\tthis.on( 'change', this.changeSetting, this );\r\n\r\n\t\t\t// Get our parent field type.\r\n\t\t\tvar fieldType = nfRadio.channel( 'fields' ).request( 'get:type', this.get( 'type' ) );\r\n\t\t\tvar parentType = fieldType.get( 'parentType' );\r\n\r\n\t\t\t// Loop through our field type \"settingDefaults\" and add any default settings.\r\n\t\t\t_.each( fieldType.get( 'settingDefaults' ), function( val, key ) {\r\n\t\t\t\tif ( 'undefined' == typeof this.get( key ) ) {\r\n\t\t\t\t\tthis.set( key, val, { silent: true } );\r\n\t\t\t\t}\r\n\t\t\t}, this );\r\n\r\n\t\t\t/*\r\n\t\t\t * If our field type is a saved field, set our field type to the actual field type\r\n\t\t\t */\r\n\t\t\tif ( 'saved' == fieldType.get( 'section' ) ) {\r\n\t\t\t\tthis.set( 'type', fieldType.get( 'type' ) );\r\n\t\t\t}\r\n\r\n\t\t\t/*\r\n\t\t\t * Trigger an init event on three channels:\r\n\t\t\t * \r\n\t\t\t * fields\r\n\t\t\t * fields-parentType\r\n\t\t\t * field-type\r\n\t\t\t *\r\n\t\t\t * This lets specific field types modify model attributes before anything uses them.\r\n\t\t\t */ \r\n\t\t\tnfRadio.channel( 'fields' ).trigger( 'init:fieldModel', this );\r\n\t\t\tnfRadio.channel( 'fields-' + parentType ).trigger( 'init:fieldModel', this );\r\n\t\t\tnfRadio.channel( 'fields-' + this.get( 'type' ) ).trigger( 'init:fieldModel', this );\r\n\r\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'fire:updateFieldKey', this.updateFieldKey );\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Fires an event on the fieldSetting-{name} channel saying we've updated a setting.\r\n\t\t * When we change the model attributes, fire an event saying we've changed something.\r\n\t\t * \r\n\t\t * @since  3.0\r\n\t\t * @return void\r\n\t\t */\r\n\t\tchangeSetting: function( model, options ) {\r\n\t\t\tnfRadio.channel( 'fieldSetting-' + _.keys( model.changedAttributes() )[0] ).trigger( 'update:setting', this, options.settingModel ) ;\r\n\t\t\tnfRadio.channel( 'fields' ).trigger( 'update:setting', this, options.settingModel );\r\n\t\t\tnfRadio.channel( 'app' ).trigger( 'update:setting', this, options.settingModel );\r\n\t\t},\r\n\r\n\t\tupdateFieldKey: function( keyModel, settingModel ) {\r\n\t\t\tnfRadio.channel( 'app' ).trigger( 'replace:fieldKey', this, keyModel, settingModel );\r\n\t\t}\r\n\t} );\r\n\t\r\n\treturn model;\r\n} );\n","/**\r\n * Collection that holds our field models.\r\n * This is the actual field data created by the user.\r\n *\r\n * We listen to the add and remove events so that we can push the new id to either the new fields or removed fields property.\r\n *\r\n * @package Ninja Forms builder\r\n * @subpackage Fields\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'models/fields/fieldCollection',['models/fields/fieldModel'], function( fieldModel ) {\r\n\tvar collection = Backbone.Collection.extend( {\r\n\t\tmodel: fieldModel,\r\n\t\tcomparator: function( model ){\r\n\t\t\treturn parseInt( model.get( 'order' ) );\r\n\t\t},\r\n\t\ttmpNum: 1,\r\n\r\n\t\tinitialize: function() {\r\n\t\t\tthis.on( 'add', this.addField, this );\r\n\t\t\tthis.on( 'remove', this.removeField, this );\r\n\r\n\t\t\tthis.listenTo( this, 'add:field', this.addNewField );\r\n\t\t\tthis.listenTo( this, 'append:field', this.appendNewField );\r\n\t\t\tthis.listenTo( this, 'remove:field', this.removeFieldResponse );\r\n\t\t\tthis.newIDs = [];\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * When we add a field, push the id onto our new fields property.\r\n\t\t * This lets us tell the server that this is a new field to be added rather than a field to be updated.\r\n\t\t *\r\n\t\t * @since 3.0\r\n\t\t * @param void\r\n\t\t */\r\n\t\taddField: function( model ) {\r\n\t\t\tthis.newIDs.push( model.get( 'id' ) );\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * When we remove a field, push the id onto our removed fields property.\r\n\t\t *\r\n\t\t * @since 3.0\r\n\t\t * @param void\r\n\t\t */\r\n\t\tremoveField: function( model ) {\r\n\t\t\tthis.removedIDs = this.removedIDs || {};\r\n\t\t\tthis.removedIDs[ model.get( 'id' ) ] = model.get( 'id' );\r\n\t\t},\r\n\r\n\t\taddNewField: function( model ) {\r\n\t\t\tthis.add( model );\r\n\t\t},\r\n\r\n\t\tappendNewField: function( model ) {\r\n\t\t\tif ( 0 == this.length ) {\r\n\t\t\t\tvar order = 0;\r\n\t\t\t} else {\r\n\t\t\t\tvar order = this.at( this.length -1 ).get( 'order' ) + 1;\r\n\t\t\t}\r\n\r\n\t\t\tmodel.set( 'order', order, { silent: true } );\r\n\t\t\tthis.add( model );\r\n\t\t},\r\n\r\n\t\tremoveFieldResponse: function( model ) {\r\n\t\t\tthis.remove( model );\r\n\t\t},\r\n\r\n\t\tfieldExists: function( fieldModel ) {\r\n\t\t\treturn -1 != this.indexOf( fieldModel );\r\n\t\t}\r\n\t} );\r\n\treturn collection;\r\n} );\r\n\n","/**\r\n * Config file for our app domains.\r\n * \r\n * this.collection represents all of our app domain (fields, actions, settings) information.\r\n *\r\n * This doesn't store the current domain, but rather all the data about each.\r\n * \r\n * This data includes:\r\n * hotkeys\r\n * header view\r\n * subheader view\r\n * content view\r\n * \r\n * @package Ninja Forms builder\r\n * @subpackage Main App\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'controllers/app/domainConfig',[\r\n\t// Require our domain collection\r\n\t'models/app/domainCollection',\r\n\t// Require our fields domain files\r\n\t'views/fields/subHeader',\r\n\t'views/fields/mainContentFieldCollection',\r\n\t'views/fields/drawer/settingsTitle',\r\n\t// Require our actions domain files\r\n\t'views/actions/mainHeader', \r\n\t'views/actions/subHeader',\r\n\t'views/actions/mainContent',\r\n\t// Require our settings domain files\r\n\t'views/advanced/mainHeader',\r\n\t'views/advanced/subHeader',\r\n\t'views/advanced/mainContent',\r\n\t// Empty View\r\n\t'views/app/empty',\r\n\t// FieldCollection: used by the default formContentData filter\r\n\t'models/fields/fieldCollection'\r\n\t], \r\n\tfunction( \r\n\t\tappDomainCollection,\r\n\t\tfieldsSubHeaderView,\r\n\t\tFieldsMainContentFieldCollectionView,\r\n\t\tfieldsSettingsTitleView,\r\n\t\tactionsMainHeaderView,\r\n\t\tactionsSubHeaderView,\r\n\t\tactionsMainContentView,\r\n\t\tsettingsMainHeaderView,\r\n\t\tsettingsSubHeaderView,\r\n\t\tsettingsMainContentView,\r\n\t\tEmptyView,\r\n\t\tFieldCollection\r\n\t) {\r\n\tvar controller = Marionette.Object.extend( {\r\n\t\tinitialize: function() {\r\n\t\t\t/*\r\n\t\t\t * Add our default formContentView filter.\r\n\t\t\t */\r\n\t\t\tnfRadio.channel( 'formContent' ).request( 'add:viewFilter', this.defaultFormContentView, 10, this );\r\n\t\t\t\r\n\t\t\t/*\r\n\t\t\t * Add our default formContentData filter.\r\n\t\t\t */\r\n\t\t\tnfRadio.channel( 'formContent' ).request( 'add:loadFilter', this.defaultFormContentLoad, 10, this );\r\n\r\n\t\t\t/*\r\n\t\t\t * Add our default formContentGutterView filters.\r\n\t\t\t */\r\n\t\t\tnfRadio.channel( 'formContentGutters' ).request( 'add:leftFilter', this.defaultFormContentGutterView, 10, this );\r\n\t\t\tnfRadio.channel( 'formContentGutters' ).request( 'add:rightFilter', this.defaultFormContentGutterView, 10, this );\r\n\r\n\t\t\t// Define our app domains\r\n\t\t\tthis.collection = new appDomainCollection( [\r\n\t\t\t\t{\r\n\t\t\t\t\tid: 'fields',\r\n\t\t\t\t\tnicename: nfi18n.domainFormFields,\r\n\t\t\t\t\thotkeys: {\r\n\t\t\t\t\t\t'Esc'\t\t\t\t: 'close:drawer',\r\n\t\t\t\t\t\t'Ctrl+Shift+n'\t\t: 'add:newField',\r\n\t\t\t\t\t\t'Ctrl+Shift+a'\t\t: 'changeDomain:actions',\r\n\t\t\t\t\t\t'Ctrl+Shift+s'\t\t: 'changeDomain:settings',\r\n\t\t\t\t\t\t'Alt+Ctrl+t'\t\t: 'open:mergeTags',\r\n\t\t\t\t\t\t'up'\t\t\t\t: 'up:mergeTags',\r\n\t\t\t\t\t\t'down'\t\t\t\t: 'down:mergeTags',\r\n\t\t\t\t\t\t'Shift+return'\t\t: 'return:mergeTags'\r\n\t\t\t\t\t},\r\n\t\t\t\t\tmobileDashicon: 'dashicons-menu',\r\n\r\n\t\t\t\t\tgetSubHeaderView: function() {\r\n\t\t\t\t\t\treturn new fieldsSubHeaderView();\r\n\t\t\t\t\t},\r\n\r\n\t\t\t\t\t/**\r\n\t\t\t\t\t * Get the formContent view that should be used in our builder.\r\n\t\t\t\t\t * Uses two filters:\r\n\t\t\t\t\t * 1) One for our formContentData\r\n\t\t\t\t\t * 2) One for our formContentView\r\n\t\t\t\t\t *\r\n\t\t\t\t\t * If we don't have any view filters, we use the default formContentView.\r\n\t\t\t\t\t * \r\n\t\t\t\t\t * @since  3.0\r\n\t\t\t\t\t * @return formContentView backbone view.\r\n\t\t\t\t\t */\r\n\t\t\t\t\tgetMainContentView: function( collection ) {\r\n\t\t\t\t\t\tvar formContentData = nfRadio.channel( 'settings' ).request( 'get:setting', 'formContentData' );\r\n\r\n\t\t\t\t\t\t/*\r\n\t\t\t\t\t\t * As of version 3.0, 'fieldContentsData' has deprecated in favour of 'formContentData'.\r\n\t\t\t\t\t\t * If we don't have this setting, then we check for this deprecated value.\r\n\t\t\t\t\t\t * \r\n\t\t\t\t\t\t * Set our fieldContentsData to our form setting 'fieldContentsData'\r\n\t\t\t\t\t\t *\r\n\t\t\t\t\t\t * TODO: Remove this backwards compatibility eventually.\r\n\t\t\t\t\t\t */\r\n\t\t\t\t\t\tif ( ! formContentData ) {\r\n\t\t\t\t\t\t\tformContentData = nfRadio.channel( 'settings' ).request( 'get:setting', 'fieldContentsData' );\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t/*\r\n\t\t\t\t\t\t * If we don't have a filter for our formContentData, default to fieldCollection.\r\n\t\t\t\t\t\t */\r\n\t\t\t\t\t\tvar formContentLoadFilters = nfRadio.channel( 'formContent' ).request( 'get:loadFilters' );\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t/* \r\n\t\t\t\t\t\t* Get our first filter, this will be the one with the highest priority.\r\n\t\t\t\t\t\t*/\r\n\t\t\t\t\t\tvar sortedArray = _.without( formContentLoadFilters, undefined );\r\n\t\t\t\t\t\tvar callback = _.first( sortedArray );\r\n\t\t\t\t\t\tformContentData = callback( formContentData, nfRadio.channel( 'app' ).request( 'get:formModel' ), true );\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t/*\r\n\t\t\t\t\t\t * Check our fieldContentViewsFilter to see if we have any defined.\r\n\t\t\t\t\t\t * If we do, overwrite our default with the view returned from the filter.\r\n\t\t\t\t\t\t */\r\n\t\t\t\t\t\tvar formContentViewFilters = nfRadio.channel( 'formContent' ).request( 'get:viewFilters' );\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t/* \r\n\t\t\t\t\t\t* Get our first filter, this will be the one with the highest priority.\r\n\t\t\t\t\t\t*/\r\n\t\t\t\t\t\tvar sortedArray = _.without( formContentViewFilters, undefined );\r\n\t\t\t\t\t\tvar callback = _.first( sortedArray );\r\n\t\t\t\t\t\tformContentView = callback();\r\n\r\n\t\t\t\t\t\tnfRadio.channel( 'settings' ).request( 'update:setting', 'formContentData', formContentData, true );\r\n\t\t\t\t\t\treturn new formContentView( { collection: formContentData } );\r\n\t\t\t\t\t},\r\n\r\n\t\t\t\t\tgetSettingsTitleView: function( data ) {\r\n\t\t\t\t\t\t/*\r\n\t\t\t\t\t\t * If we are dealing with a field model, return the fields settings view, otherwise, return the default.\r\n\t\t\t\t\t\t */\r\n\t\t\t\t\t\tif ( 'fields' == data.model.get( 'objectDomain' ) ) {\r\n\t\t\t\t\t\t\treturn new fieldsSettingsTitleView( data );\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\treturn this.get( 'getDefaultSettingsTitleView' ).call( this, data );\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t},\r\n\r\n\t\t\t\t\tgetGutterLeftView: function( data ) {\r\n\t\t\t\t\t\t/*\r\n\t\t\t\t\t\t * Check our fieldContentViewsFilter to see if we have any defined.\r\n\t\t\t\t\t\t * If we do, overwrite our default with the view returned from the filter.\r\n\t\t\t\t\t\t */\r\n\t\t\t\t\t\tvar gutterFilters = nfRadio.channel( 'formContentGutters' ).request( 'get:leftFilters' );\r\n\r\n\t\t\t\t\t\t/* \r\n\t\t\t\t\t\t* Get our first filter, this will be the one with the highest priority.\r\n\t\t\t\t\t\t*/\r\n\t\t\t\t\t\tvar sortedArray = _.without( gutterFilters, undefined );\r\n\t\t\t\t\t\tvar callback = _.first( sortedArray );\r\n\t\t\t\t\t\tgutterView = callback();\r\n\r\n\t\t\t\t\t\treturn new gutterView(); \r\n\t\t\t\t\t},\r\n\r\n\t\t\t\t\tgetGutterRightView: function() {\r\n\t\t\t\t\t\t/*\r\n\t\t\t\t\t\t * Check our fieldContentViewsFilter to see if we have any defined.\r\n\t\t\t\t\t\t * If we do, overwrite our default with the view returned from the filter.\r\n\t\t\t\t\t\t */\r\n\t\t\t\t\t\tvar gutterFilters = nfRadio.channel( 'formContentGutters' ).request( 'get:rightFilters' );\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t/* \r\n\t\t\t\t\t\t* Get our first filter, this will be the one with the highest priority.\r\n\t\t\t\t\t\t*/\r\n\t\t\t\t\t\tvar sortedArray = _.without( gutterFilters, undefined );\r\n\t\t\t\t\t\tvar callback = _.first( sortedArray );\r\n\t\t\t\t\t\tgutterView = callback();\r\n\r\n\t\t\t\t\t\treturn new gutterView(); \r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\tid: 'actions',\r\n\t\t\t\t\tnicename: nfi18n.domainActions,\r\n\t\t\t\t\thotkeys: {\r\n\t\t\t\t\t\t'Esc'\t\t\t\t: 'close:drawer',\r\n\t\t\t\t\t\t'Ctrl+Shift+n'\t\t: 'add:newAction',\r\n\t\t\t\t\t\t'Ctrl+Shift+f'\t\t: 'changeDomain:fields',\r\n\t\t\t\t\t\t'Ctrl+Shift+s'\t\t: 'changeDomain:settings',\r\n\t\t\t\t\t\t'Alt+Ctrl+t'\t\t: 'open:mergeTags',\r\n\t\t\t\t\t\t'up'\t\t\t\t: 'up:mergeTags',\r\n\t\t\t\t\t\t'down'\t\t\t\t: 'down:mergeTags',\r\n\t\t\t\t\t\t'Shift+return'\t\t: 'return:mergeTags'\r\n\t\t\t\t\t},\r\n\t\t\t\t\tmobileDashicon: 'dashicons-external',\r\n\r\n\t\t\t\t\tgetSubHeaderView: function() {\r\n\t\t\t\t\t\treturn new actionsSubHeaderView();\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\r\n\t\t\t\t\tgetMainContentView: function() {\r\n\t\t\t\t\t\tvar collection = nfRadio.channel( 'actions' ).request( 'get:collection' );\r\n\t\t\t\t\t\treturn new actionsMainContentView( { collection: collection } );\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\tid: 'settings',\r\n\t\t\t\t\tnicename: nfi18n.domainAdvanced,\r\n\t\t\t\t\thotkeys: {\r\n\t\t\t\t\t\t'Esc'\t\t\t\t: 'close:drawer',\r\n\t\t\t\t\t\t'Ctrl+Shift+f'\t\t: 'changeDomain:fields',\r\n\t\t\t\t\t\t'Ctrl+Shift+a'\t\t: 'changeDomain:actions',\r\n\t\t\t\t\t\t'Alt+Ctrl+t'\t\t: 'open:mergeTags',\r\n\t\t\t\t\t\t'up'\t\t\t\t: 'up:mergeTags',\r\n\t\t\t\t\t\t'down'\t\t\t\t: 'down:mergeTags',\r\n\t\t\t\t\t\t'Shift+return'\t\t: 'return:mergeTags'\r\n\t\t\t\t\t},\r\n\t\t\t\t\tmobileDashicon: 'dashicons-admin-generic',\r\n\r\n\t\t\t\t\tgetSubHeaderView: function() {\r\n\t\t\t\t\t\treturn new settingsSubHeaderView();\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\r\n\t\t\t\t\tgetMainContentView: function() {\r\n\t\t\t\t\t\tvar collection = nfRadio.channel( 'settings' ).request( 'get:typeCollection' );\r\n\t\t\t\t\t\treturn new settingsMainContentView( { collection: collection } );\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\tid: 'preview',\r\n\t\t\t\t\tnicename: 'Preview Form',\r\n\t\t\t\t\tclasses: 'preview',\r\n\t\t\t\t\tdashicons: 'dashicons-visibility',\r\n\t\t\t\t\tmobileDashicon: 'dashicons-visibility',\r\n\t\t\t\t\turl: nfAdmin.previewurl\r\n\t\t\t\t}\r\n\t\t\t] );\r\n\r\n\t\t\t/*\r\n\t\t\t * Send out a radio message with our domain config collection.\r\n\t\t\t */\r\n\t\t\tnfRadio.channel( 'app' ).trigger( 'init:domainCollection', this.collection );\r\n\r\n\t\t\t/*\r\n\t\t\t * Respond to requests to get the app domain collection.\r\n\t\t\t */\r\n\t\t\tnfRadio.channel( 'app' ).reply( 'get:domainCollection', this.getDomainCollection, this );\r\n\t\t\tnfRadio.channel( 'app' ).reply( 'get:domainModel', this.getDomainModel, this );\r\n\t\t},\r\n\r\n\t\tgetDomainCollection: function() {\r\n\t\t\treturn this.collection;\r\n\t\t},\r\n\r\n\t\tgetDomainModel: function( id ) {\r\n\t\t\treturn this.collection.get( id );\r\n\t\t},\r\n\r\n\t\tdefaultFormContentView: function( formContentData ) {\r\n\t\t\treturn FieldsMainContentFieldCollectionView;\r\n\t\t},\r\n\r\n\t\tdefaultFormContentLoad: function( formContentData ) {\r\n\t\t\tvar fieldCollection = nfRadio.channel( 'fields' ).request( 'get:collection' );\r\n\t\t\t/*\r\n\t\t\t * If we only have one load filter, we can just return the field collection.\r\n\t\t\t */\r\n\t\t\tvar formContentLoadFilters = nfRadio.channel( 'formContent' ).request( 'get:loadFilters' );\r\n\t\t\tvar sortedArray = _.without( formContentLoadFilters, undefined );\r\n\r\n\t\t\tif ( 1 == sortedArray.length || 'undefined' == typeof formContentData || true === formContentData instanceof Backbone.Collection ) return fieldCollection;\r\n\r\n\t\t\t/*\r\n\t\t\t * If another filter is registered, we are calling this from somewhere else.\r\n\t\t\t */\r\n\r\n        \tvar fieldModels = _.map( formContentData, function( key ) {\r\n        \t\treturn fieldCollection.findWhere( { key: key } );\r\n        \t}, this );\r\n\r\n        \treturn new FieldCollection( fieldModels );\r\n\t\t},\r\n\r\n\t\tdefaultFormContentGutterView: function( formContentData ) {\r\n\t\t\treturn EmptyView;\r\n\t\t}\r\n\r\n\t});\r\n\r\n\treturn controller;\r\n} );\n","/**\r\n * Model for our app data.\r\n * Listens for changes to the 'clean' attribute and triggers a radio message when the state changes.\r\n * \r\n * @package Ninja Forms builder\r\n * @subpackage Fields\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'models/app/appModel',[], function() {\r\n\tvar model = Backbone.Model.extend( {\r\n\t\tdefaults: {\r\n\t\t\tloading: false\r\n\t\t},\r\n\r\n\t\tinitialize: function() {\r\n\t\t\t// Listen to changes to our 'clean' attribute.\r\n\t\t\tthis.on( 'change:clean', this.changeStatus, this );\r\n\t\t},\r\n\r\n\t\tchangeStatus: function() {\r\n\t\t\t// Send out a radio message when the 'clean' attribute changes.\r\n\t\t\tnfRadio.channel( 'app' ).trigger( 'change:clean', this.get( 'clean' ) );\r\n\t\t}\r\n\t} );\r\n\t\r\n\treturn model;\r\n} );\n","/**\r\n * Creates and stores a model that represents app-wide data. i.e. current domain, current drawer, clean, etc.\r\n *\r\n * clean is a boolean that represents whether or not changes have been made.\r\n * \r\n * @package Ninja Forms builder\r\n * @subpackage Main App\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'controllers/app/data',['models/app/appModel'], function( appModel ) {\r\n\tvar controller = Marionette.Object.extend( {\r\n\t\tinitialize: function() {\r\n\t\t\t// Get the collection that represents all the parts of our application.\r\n\t\t\tvar appDomainCollection = nfRadio.channel( 'app' ).request( 'get:domainCollection' );\r\n\t\t\t// Setup our initial model.\r\n\t\t\tthis.model = new appModel( {\r\n\t\t\t\tcurrentDrawer: false,\r\n\t\t\t\tcurrentDomain: appDomainCollection.get( 'fields' ),\r\n\t\t\t\tclean: true\r\n\t\t\t} );\r\n\r\n\t\t\t/*\r\n\t\t\t * Set the mobile setting used to track whether or not we're on a mobile device.\r\n\t\t\t */\r\n\t\t\tvar mobile = ( 1 == nfAdmin.mobile ) ? true : false;\r\n\t\t\tthis.model.set( 'mobile', mobile );\r\n\r\n\t\t\t/*\r\n\t\t\t * Respond to requests to see if we are on mobile.\r\n\t\t\t */\r\n\t\t\tnfRadio.channel( 'app' ).reply( 'is:mobile', this.isMobile, this );\r\n\r\n\t\t\t/*\r\n\t\t\t * Respond to app channel requests for information about the state of our app.\r\n\t\t\t */\r\n\t\t\tnfRadio.channel( 'app' ).reply( 'get:data', this.getData, this );\r\n\t\t\tnfRadio.channel( 'app' ).reply( 'get:setting', this.getSetting, this );\r\n\t\t\tnfRadio.channel( 'app' ).reply( 'get:currentDomain', this.getCurrentDomain, this );\r\n\t\t\tnfRadio.channel( 'app' ).reply( 'get:currentDrawer', this.getCurrentDrawer, this );\r\n\t\t\tnfRadio.channel( 'drawer' ).reply( 'get:current', this.getCurrentDrawer, this );\r\n\r\n\t\t\t/*\r\n\t\t\t * Respond to app channel requests to update app settings.\r\n\t\t\t */\t\t\r\n\t\t\tnfRadio.channel( 'app' ).reply( 'update:currentDomain', this.updateCurrentDomain, this );\r\n\t\t\tnfRadio.channel( 'app' ).reply( 'update:currentDrawer', this.updateCurrentDrawer, this );\r\n\t\t\tnfRadio.channel( 'app' ).reply( 'update:setting', this.updateSetting, this );\r\n\r\n\t\t},\r\n\r\n\t\tupdateCurrentDomain: function( model ) {\r\n\t\t\tthis.updateSetting( 'currentDomain', model );\r\n\t\t},\r\n\r\n\t\tupdateSetting: function( setting, value ) {\r\n\t\t\tthis.model.set( setting, value );\r\n\t\t\treturn true;\r\n\t\t},\r\n\r\n\t\tgetSetting: function( setting ) {\r\n\t\t\treturn this.model.get( setting );\r\n\t\t},\r\n\r\n\t\tgetData: function() {\r\n\t\t\treturn this.model;\r\n\t\t},\r\n\r\n\t\tgetCurrentDomain: function() {\r\n\t\t\treturn this.model.get( 'currentDomain' );\r\n\t\t},\r\n\r\n\t\tupdateCurrentDrawer: function( drawerID ) {\r\n\t\t\tthis.updateSetting( 'currentDrawer', drawerID );\r\n\t\t\treturn true;\r\n\t\t},\r\n\r\n\t\tgetCurrentDrawer: function() {\r\n\t\t\tvar currentDrawerID = this.model.get( 'currentDrawer' );\r\n\t\t\treturn nfRadio.channel( 'app' ).request( 'get:drawer', currentDrawerID );\r\n\t\t},\r\n\r\n\t\tisMobile: function() {\r\n\t\t\treturn this.model.get( 'mobile' );\r\n\t\t}\r\n\r\n\r\n\t});\r\n\r\n\treturn controller;\r\n} );\n","/**\r\n * Listens for click events to expand/collapse setting groups.\r\n * \r\n * @package Ninja Forms builder\r\n * @subpackage Fields - New Field Drawer\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'controllers/app/drawerToggleSettingGroup',[], function() {\r\n\tvar controller = Marionette.Object.extend( {\r\n\t\tinitialize: function() {\r\n\t\t\t// Listen for click events on our settings group.\r\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer' ), 'click:toggleSettingGroup', this.toggleSettingGroup );\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Set the 'display' attribute of our group model to true or false to toggle.\r\n\t\t * \r\n\t\t * @since  3.0\r\n\t\t * @param  Object\t\t\te     \tevent\r\n\t\t * @param  backbone.model \tmodel \tgroup setting model\r\n\t\t * @return void\r\n\t\t */\r\n\t\ttoggleSettingGroup: function( e, model ) {\r\n\t\t\tif ( model.get( 'display' ) ) {\r\n\t\t\t\t/*\r\n\t\t\t\t * Make sure that none of our settings have errors\r\n\t\t\t\t */\r\n\t\t\t\tvar errors = false;\r\n\t\t\t\t_.each( model.get( 'settings' ).models, function( setting ) {\r\n\t\t\t\t\tif ( setting.get( 'error' ) ) {\r\n\t\t\t\t\t\terrors = true;\r\n\t\t\t\t\t}\r\n\t\t\t\t} );\r\n\t\t\t\tif ( ! errors ) {\r\n\t\t\t\t\tmodel.set( 'display', false );\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tmodel.set( 'display', true );\r\n\t\t\t}\r\n\t\t}\r\n\t});\r\n\r\n\treturn controller;\r\n} );\n","/**\r\n * Updates our database with our form data.\r\n * \r\n * @package Ninja Forms builder\r\n * @subpackage Fields\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'controllers/app/updateDB',[], function() {\r\n\tvar controller = Marionette.Object.extend( {\r\n\t\tinitialize: function() {\r\n\t\t\t// Listen for the closing of the drawer and update when it's closed.\r\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer' ), 'closed', this.updateDB );\r\n\t\t\t// Respond to requests to update the database.\r\n\t\t\tnfRadio.channel( 'app' ).reply( 'update:db', this.updateDB, this );\r\n\t\t\t/*\r\n\t\t\t * Register our default formContent save filter.\r\n\t\t\t * This converts our collection into an array of keys.\r\n\t\t\t */\r\n\t\t\tnfRadio.channel( 'formContent' ).request( 'add:saveFilter', this.defaultSaveFilter, 10, this );\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Update our database.\r\n\t\t * If action isn't specified, assume we're updating the preview.\r\n\t\t * \r\n\t\t * @since  3.0\r\n\t\t * @param  string \taction preview or publish\r\n\t\t * @return void\r\n\t\t */\r\n\t\tupdateDB: function( action ) {\r\n\t\t\t// If our app is clean, dont' update.\r\n\t\t\tif ( nfRadio.channel( 'app' ).request( 'get:setting', 'clean' ) ) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\r\n\t\t\t// Default action to preview.\r\n\t\t\taction = action || 'preview';\r\n\r\n\t\t\t// Setup our ajax actions based on the action we're performing\r\n\t\t\tif ( 'preview' == action ) {\r\n\t\t\t\tvar jsAction = 'nf_preview_update';\r\n\t\t\t} else if ( 'publish' == action ) {\r\n\t\t\t\tvar jsAction = 'nf_save_form';\r\n\t\t\t}\r\n\r\n\t\t\tvar formModel = nfRadio.channel( 'app' ).request( 'get:formModel' );\r\n\r\n\t\t\t/*\r\n\t\t\t * There are pieces of data that are only needed for the builder and not for the front-end.\r\n\t\t\t * We need to unset those.\r\n\t\t\t * TODO: Make this more dynamic/filterable.\r\n\t\t\t */\r\n\t\t\t_.each( formModel.get( 'fields' ).models, function( fieldModel, index ) {\r\n\t\t\t\tfieldModel.unset( 'jBox', { silent: true } );\r\n\t\t\t} );\r\n\r\n\t\t\t/*\r\n\t\t\t * The main content of our form is called the formContent.\r\n\t\t\t * In this next section, we check to see if any add-ons want to modify that contents before we save.\r\n\t\t\t * If there aren't any filters found, we default to the field collection.\r\n\t\t\t * \r\n\t\t\t */\r\n\t\t\t\r\n\t\t\tvar formContentData = nfRadio.channel( 'settings' ).request( 'get:setting', 'formContentData' );\r\n\t\t\t/*\r\n\t\t\t * As of version 3.0, 'fieldContentsData' has deprecated in favour of 'formContentData'.\r\n\t\t\t * If we don't have this setting, then we check for this deprecated value.\r\n\t\t\t * \r\n\t\t\t * Set our fieldContentsData to our form setting 'fieldContentsData'\r\n\t\t\t *\r\n\t\t\t * TODO: Remove this backwards compatibility eventually.\r\n\t\t\t */\r\n\t\t\tif ( ! formContentData ) {\r\n\t\t\t\tformContentData = nfRadio.channel( 'settings' ).request( 'get:setting', 'fieldContentsData' );\r\n\t\t\t}\r\n\r\n\t\t\tvar formContentSaveDataFilters = nfRadio.channel( 'formContent' ).request( 'get:saveFilters' );\r\n\t\t\t\t\t\t\r\n\t\t\t/* \r\n\t\t\t* Get our first filter, this will be the one with the highest priority.\r\n\t\t\t*/\r\n\t\t\tvar sortedArray = _.without( formContentSaveDataFilters, undefined );\r\n\t\t\tvar callback = _.first( sortedArray );\r\n\t\t\t/*\r\n\t\t\t * Set our formContentData to the callback specified in the filter, passing our current formContentData.\r\n\t\t\t */\r\n\t\t\tformContentData = callback( formContentData );\r\n\t\t\t\r\n\t\t\tif ( 'publish' == action && formModel.get( 'show_publish_options' ) ) {\r\n\t\t\t\tnfRadio.channel( 'app' ).request( 'open:drawer', 'newForm' );\r\n\t\t\t\tvar builderEl = nfRadio.channel( 'app' ).request( 'get:builderEl' );\r\n\t\t\t\tjQuery( builderEl ).addClass( 'disable-main' );\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\r\n\t\t\t// Get our form data\r\n\t\t\tvar formData = nfRadio.channel( 'app' ).request( 'get:formModel' );\r\n\r\n\t\t\t// Turn our formData model into an object\r\n\t\t\tvar data = JSON.parse( JSON.stringify( formData ) );\r\n\t\t\tdata.settings.formContentData = formContentData;\r\n\t\t\t/**\r\n\t\t\t * Prepare fields for submission.\r\n\t\t\t */\r\n\t\t\t\r\n\t\t\t// Get the field IDs that we've deleted.\r\n\t\t\tvar removedIDs = formData.get( 'fields' ).removedIDs;\r\n\r\n\t\t\t/*\r\n\t\t\t * data.fields is an array of objects like:\r\n\t\t\t * field.label = blah\r\n\t\t\t * field.label_pos = blah\r\n\t\t\t * etc.\r\n\t\t\t *\r\n\t\t\t * And we need that format to be:\r\n\t\t\t * field.settings.label = blah\r\n\t\t\t * field.settings.label_pos = blah\r\n\t\t\t *\r\n\t\t\t * So, we loop through our fields and create a field.settings object.\r\n\t\t\t */\r\n\t\t\t_.each( data.fields, function( field ) {\r\n\t\t\t\tvar id = field.id;\r\n\t\t\t\t// We dont' want to update id or parent_id\r\n\t\t\t\tdelete field.id;\r\n\t\t\t\tdelete field.parent_id;\r\n\t\t\t\tvar settings = {};\r\n\t\t\t\t// Loop through all the attributes of our fields\r\n\t\t\t\tfor (var prop in field) {\r\n\t\t\t\t    if ( field.hasOwnProperty( prop ) ) {\r\n\t\t\t\t    \t// Set our settings.prop value.\r\n\t\t\t\t        settings[ prop ] = field[ prop ];\r\n\t\t\t\t        // Delete the property from the field.\r\n\t\t\t\t        delete field[ prop ];\r\n\t\t\t\t    }\r\n\t\t\t\t}\r\n\r\n\t\t\t\tfor( var setting in settings ){\r\n\t\t\t\t\tif( null === settings[ setting ] ) {\r\n\t\t\t\t\t\tdelete settings[setting];\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Update our field object.\r\n\t\t\t\tfield.settings = settings;\r\n\t\t\t\tfield.id = id;\r\n\t\t\t} );\r\n\r\n\t\t\t// Set our deleted_fields object so that we can know which fields were removed.\r\n\t\t\tdata.deleted_fields = removedIDs;\r\n\r\n\t\t\t/**\r\n\t\t\t * Prepare actions for submission.\r\n\t\t\t */\r\n\t\t\t\r\n\t\t\t// Get the action IDs that we've deleted.\r\n\t\t\tvar removedIDs = formData.get( 'actions' ).removedIDs;\r\n\r\n\t\t\t/*\r\n\t\t\t * data.actions is an array of objects like:\r\n\t\t\t * action.label = blah\r\n\t\t\t * action.label_pos = blah\r\n\t\t\t * etc.\r\n\t\t\t *\r\n\t\t\t * And we need that format to be:\r\n\t\t\t * action.settings.label = blah\r\n\t\t\t * action.settings.label_pos = blah\r\n\t\t\t *\r\n\t\t\t * So, we loop through our actions and create a field.settings object.\r\n\t\t\t */\r\n\t\t\t_.each( data.actions, function( action ) {\r\n\t\t\t\tvar id = action.id;\r\n\t\t\t\t// We dont' want to update id or parent_id\r\n\t\t\t\tdelete action.id;\r\n\t\t\t\tdelete action.parent_id;\r\n\t\t\t\tvar settings = {};\r\n\t\t\t\t// Loop through all the attributes of our actions\r\n\t\t\t\tfor (var prop in action) {\r\n\t\t\t\t    if ( action.hasOwnProperty( prop ) ) {\r\n\t\t\t\t    \t// Set our settings.prop value.\r\n\t\t\t\t        settings[ prop ] = action[ prop ];\r\n\t\t\t\t        // Delete the property from the action.\r\n\t\t\t\t        delete action[ prop ];\r\n\t\t\t\t    }\r\n\t\t\t\t}\r\n\t\t\t\t// Update our action object.\r\n\t\t\t\taction.settings = settings;\r\n\t\t\t\taction.id = id;\r\n\t\t\t} );\r\n\r\n\t\t\t// Set our deleted_actions object so that we can know which actions were removed.\r\n\t\t\tdata.deleted_actions = removedIDs;\r\n\r\n\t\t\t// Turn our object into a JSON string.\r\n\t\t\tdata = JSON.stringify( data );\r\n\t\t\t// Run anything that needs to happen before we update.\r\n\t\t\tnfRadio.channel( 'app' ).trigger( 'before:updateDB', data );\r\n\r\n\t\t\tif ( 'publish' == action ) {\r\n\t\t\t\tnfRadio.channel( 'app' ).request( 'update:setting', 'loading', true );\r\n\t\t\t\tnfRadio.channel( 'app' ).trigger( 'change:loading' );\t\r\n\r\n\t\t\t\t// If we're on mobile, show a notice that we're publishing\r\n\t\t\t\tif ( nfRadio.channel( 'app' ).request( 'is:mobile' ) ) {\r\n\t\t\t\t\tnfRadio.channel( 'notices' ).request( 'add', 'publishing', 'Your Changes Are Being Published', { autoClose: false } );\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// Update\r\n\t\t\tjQuery.post( ajaxurl, { action: jsAction, form: data, security: nfAdmin.ajaxNonce }, function( response ) {\r\n\t\t\t\ttry {\r\n\t\t\t\t\tresponse = JSON.parse( response );\r\n\t\t\t\t\tresponse.action = action;\r\n\t\t\t\t\t// Run anything that needs to happen after we update.\r\n\t\t\t\t\tnfRadio.channel( 'app' ).trigger( 'response:updateDB', response );\r\n\t\t\t\t\tif ( ! nfRadio.channel( 'app' ).request( 'is:mobile' ) && 'preview' == action ) {\r\n\t\t\t\t\t\t// nfRadio.channel( 'notices' ).request( 'add', 'previewUpdate', 'Preview Updated'\t);\r\n\t\t\t\t\t}\r\n\t\t\t\t} catch( exception ) {\r\n\t\t\t\t\tconsole.log( 'Something went wrong!' );\r\n\t\t\t\t\tconsole.log( exception );\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t} ).fail( function( xhr, status, error ) {\r\n                console.log( xhr.status );\r\n                console.log( error );\r\n                // @todo Convert alert to jBox Modal.\r\n                alert( xhr.status + ' ' + error + '\\r\\n' + 'An error on the server caused your form not to publish.\\r\\nPlease contact Ninja Forms Support with your PHP Error Logs.\\r\\nhttps://ninjaforms.com/contact' );\r\n\t\t\t});\r\n\t\t},\r\n\r\n\t\tdefaultSaveFilter: function( formContentData ) {\r\n\t\t\treturn formContentData.pluck( 'key' );\r\n\t\t}\r\n\r\n\t});\r\n\r\n\treturn controller;\r\n} );\r\n\n","/**\r\n * Model that represents our form data.\r\n * \r\n * @package Ninja Forms builder\r\n * @subpackage Fields\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'models/app/formModel',[], function() {\r\n\tvar model = Backbone.Model.extend( {\r\n\t\tinitialize: function() {\r\n\t\t\tif ( ! jQuery.isNumeric( this.get( 'id' ) ) ) {\r\n\t\t\t\tthis.set( 'show_publish_options', true, { silent: true } );\r\n\t\t\t} else {\r\n\t\t\t\tthis.set( 'show_publish_options', false, { silent: true } );\r\n\t\t\t}\r\n\t\t}\r\n\t} );\r\n\t\r\n\treturn model;\r\n} );\n","/**\r\n * Stores our form data and responds to requests for it.\r\n * Form data stores fields, actions, and settings.\r\n * \r\n * @package Ninja Forms builder\r\n * @subpackage Fields\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'controllers/app/formData',['models/app/formModel'], function( formModel) {\r\n\tvar controller = Marionette.Object.extend( {\r\n\t\tinitialize: function() {\r\n\t\t\t// Instantiate Form Model\r\n\t\t\tthis.model = new formModel( { id: preloadedFormData.id } );\r\n\t\t\t// Set our field collection\r\n\t\t\tthis.model.set( 'fields', nfRadio.channel( 'fields' ).request( 'get:collection' ) );\r\n\t\t\t// Set our actions collection\r\n\t\t\tthis.model.set( 'actions', nfRadio.channel( 'actions' ).request( 'get:collection' ) );\r\n\t\t\t// Set our settings collection\r\n\t\t\tthis.model.set( 'settings', nfRadio.channel( 'settings' ).request( 'get:settings' ) );\r\n\t\t\t// Respond to requests for form data.\r\n\t\t\tnfRadio.channel( 'app' ).reply( 'get:formModel', this.getFormModel, this );\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Return form data model.\r\n\t\t * \r\n\t\t * @since  3.0\r\n\t\t * @return backbone.model\r\n\t\t */\r\n\t\tgetFormModel: function() {\r\n\t\t\treturn this.model;\r\n\t\t}\r\n\r\n\t});\r\n\r\n\treturn controller;\r\n} );\n","/**\r\n * Handles changing our preview link when we change the 'clean' state of our app.\r\n * \r\n * @package Ninja Forms builder\r\n * @subpackage Fields\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'controllers/app/previewLink',[], function() {\r\n\tvar controller = Marionette.Object.extend( {\r\n\t\tinitialize: function() {\r\n\t\t\t// Listen for events that would change our preview link\r\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'before:sendChanges', this.disablePreview, this );\r\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'response:sendChanges', this.enablePreview, this );\r\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'change:clean', this.changePreviewNicename, this );\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Disable our preview link before we send data to update our preview.\r\n\t\t * \r\n\t\t * @since  3.0\r\n\t\t * @return void\r\n\t\t */\r\n\t\tdisablePreview: function() {\r\n\t\t\t// Get our preview domain\r\n\t\t\tvar appDomains = nfRadio.channel( 'app' ).request( 'get:domainCollection' );\r\n\t\t\tvar preview = appDomains.get( 'preview' );\r\n\t\t\t// Set disabled to true. This will trigger the preview link view to redraw.\r\n\t\t\tpreview.set( 'disabled', true );\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Change the preview link text from \"Preview Form\" to \"Preview Changes\" or vice-versa\r\n\t\t * \r\n\t\t * @since  3.0\r\n\t\t * @param  boolean \tclean app data state\r\n\t\t * @return void\r\n\t\t */\r\n\t\tchangePreviewNicename: function( clean ) {\r\n\t\t\t// Get our preview domain\r\n\t\t\tvar appDomains = nfRadio.channel( 'app' ).request( 'get:domainCollection' );\r\n\t\t\tvar preview = appDomains.get( 'preview' );\r\n\r\n\t\t\t// If we have unsaved changes, set our text to 'changes' otherwise, set it to 'form'\r\n\t\t\tif ( ! clean ) {\r\n\t\t\t\tvar nicename = 'Preview Changes';\r\n\t\t\t} else {\r\n\t\t\t\tvar nicename = 'Preview Form';\r\n\t\t\t}\r\n\r\n\t\t\tpreview.set( 'nicename', nicename );\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Enable our preview button.\r\n\t\t * This is triggered when we get a response from our preview update.\r\n\t\t * \r\n\t\t * @since  3.0\r\n\t\t * @return void\r\n\t\t */\r\n\t\tenablePreview: function() {\r\n\t\t\t// Get our preview domain\r\n\t\t\tvar appDomains = nfRadio.channel( 'app' ).request( 'get:domainCollection' );\r\n\t\t\tvar preview = appDomains.get( 'preview' );\r\n\t\t\t// Set disabled to false. This will trigger the preview link view to redraw.\r\n\t\t\tpreview.set( 'disabled', false );\r\n\t\t}\r\n\r\n\t});\r\n\r\n\treturn controller;\r\n} );\n","/**\r\n * Listens to our app channel for requests to change the current domain.\r\n *\r\n * The app menu and the main submenu both contain clickable links that change the current domain.\r\n * \r\n * @package Ninja Forms builder\r\n * @subpackage Main App\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'controllers/app/menuButtons',[], function() {\r\n\tvar controller = Marionette.Object.extend( {\r\n\t\tinitialize: function() {\r\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'click:publish', this.publish );\r\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'click:viewChanges', this.viewChanges );\r\n\t\t},\r\n\r\n\t\tpublish: function() {\r\n\t\t\tnfRadio.channel( 'app' ).request( 'update:db', 'publish' );\r\n\t\t},\r\n\r\n\t\tviewChanges: function() {\r\n\t\t\tvar changeCollection = nfRadio.channel( 'changes' ).request( 'get:collection' );\r\n\t\t\tnfRadio.channel( 'app' ).request( 'open:drawer', 'viewChanges', { collection: changeCollection } );\r\n\t\t}\r\n\r\n\t});\r\n\r\n\treturn controller;\r\n} );\n","/**\r\n * Model that represents our change data.\r\n * \r\n * @package Ninja Forms builder\r\n * @subpackage Fields\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'models/app/changeModel',[], function() {\r\n\tvar model = Backbone.Model.extend( {\r\n\t\tdefaults: {\r\n\t\t\tdisabled: false\r\n\t\t}\r\n\t} );\r\n\t\r\n\treturn model;\r\n} );\n","/**\r\n * Holds all of our change models.\r\n * \r\n * @package Ninja Forms builder\r\n * @subpackage Fields\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'models/app/changeCollection',['models/app/changeModel'], function( domainModel ) {\r\n\tvar collection = Backbone.Collection.extend( {\r\n\t\tmodel: domainModel,\r\n\r\n\t\tcomparator: function( model ) {\r\n\t\t\tvar id = parseInt( model.cid.replace( 'c', '' ) );\r\n\t\t\treturn -id;\r\n\t\t}\r\n\t} );\r\n\treturn collection;\r\n} );\n","/**\r\n * Track settings changes across our app.\r\n * \r\n * @package Ninja Forms builder\r\n * @subpackage Main App\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'controllers/app/trackChanges',['models/app/changeCollection', 'models/app/changeModel'], function( changeCollection, ChangeModel ) {\r\n\tvar controller = Marionette.Object.extend( {\r\n\t\tinitialize: function() {\r\n\t\t\tthis.collection = new changeCollection();\r\n\t\t\t// Respond to any requests to add a change directly.\r\n\t\t\tnfRadio.channel( 'changes' ).reply( 'register:change', this.registerChange, this );\r\n\t\t\t// Respond to requests for the change collection\r\n\t\t\tnfRadio.channel( 'changes' ).reply( 'get:collection', this.getCollection, this );\r\n\t\t\t// Listen for changes in our clean state. If it goes to clean, clear our collection.\r\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'change:clean', this.maybeResetCollection );\r\n\t\t},\r\n\r\n\t\tregisterChange: function( action, model, changes, label, data ) {\r\n\t\t\tvar data = typeof data !== 'undefined' ? data : {};\r\n\t\t\tif ( 'undefined' == typeof label.dashicon ) {\r\n\t\t\t\tlabel.dashicon = 'admin-generic';\r\n\t\t\t}\r\n\t\t\tvar changeModel = new ChangeModel({\r\n\t\t\t\taction: action,\r\n\t\t\t\tmodel: model,\r\n\t\t\t\tchanges: changes,\r\n\t\t\t\tlabel: label,\r\n\t\t\t\tdata: data\t\t\r\n\t\t\t} );\r\n\t\t\tthis.collection.add( changeModel );\r\n\t\t\treturn changeModel;\r\n\t\t},\r\n\r\n\t\tgetCollection: function() {\r\n\t\t\treturn this.collection;\r\n\t\t},\r\n\r\n\t\tmaybeResetCollection: function( clean ) {\r\n\t\t\tif ( clean ) {\r\n\t\t\t\tthis.collection.reset();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t});\r\n\r\n\treturn controller;\r\n} );\n","define( 'controllers/app/undoChanges',[], function() {\r\n\tvar controller = Marionette.Object.extend( {\r\n\t\tinitialize: function() {\r\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer' ), 'click:undoChanges', this.undoChanges, this );\r\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer' ), 'click:undoSingle', this.undoSingle, this );\r\n\t\t},\r\n\r\n\t\tundoChanges: function() {\r\n\t\t\tvar changeCollection = nfRadio.channel( 'changes' ).request( 'get:collection' );\r\n\t\t\tchangeCollection.sort();\r\n\t\t\tvar that = this;\r\n\t\t\t_.each( changeCollection.models, function( change ) {\r\n\t\t\t\tthat.undoSingle( change, true );\r\n\t\t\t} );\r\n\t\t\tchangeCollection.reset();\r\n\t\t\t// Update preview.\r\n\t\t\tnfRadio.channel( 'app' ).request( 'update:db' );\t\t\t\r\n\t\t\tnfRadio.channel( 'app' ).request( 'update:setting', 'clean', true );\r\n\t\t\tnfRadio.channel( 'app' ).request( 'close:drawer' );\r\n\t\t},\r\n\r\n\t\tundoSingle: function( change, undoAll ) {\r\n\t\t\tnfRadio.channel( 'changes' ).request( 'undo:' + change.get( 'action' ), change, undoAll );\r\n\t\t}\r\n\r\n\t});\r\n\r\n\treturn controller;\r\n} );\n","/**\r\n * Listens for our update:db response and replaces tmp ids with new ids if we were performing the publish action.\r\n * \r\n * @package Ninja Forms builder\r\n * @subpackage Main App\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'controllers/app/publishResponse',[], function() {\r\n\tvar controller = Marionette.Object.extend( {\r\n\t\tinitialize: function() {\r\n\t\t\t// Listen to our app channel for the updateDB response.\r\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'response:updateDB', this.publishResponse );\r\n\t\t},\r\n\r\n\t\tpublishResponse: function( response ) {\r\n\t\t\t// If we aren't performing a publish action, bail.\r\n\t\t\tif ( 'publish' !== response.action ) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\t// Check to see if we have any new ids. \r\n\t\t\tif ( 'undefined' != typeof response.data.new_ids ) {\r\n\r\n\t\t\t\t// If we have any new fields, update their models with the new id.\r\n\t\t\t\tif ( 'undefined' != typeof response.data.new_ids.fields ) {\r\n\t\t\t\t\t_.each( response.data.new_ids.fields, function( newID, oldID ) {\r\n\t\t\t\t\t\tvar field = nfRadio.channel( 'fields' ).request( 'get:field', oldID );\r\n\t\t\t\t\t\tif ( field ) {\r\n\t\t\t\t\t\t\tfield.set( 'id', newID );\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t} );\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// If we have any new actions, update their models with the new id.\r\n\t\t\t\tif ( 'undefined' != typeof response.data.new_ids.actions ) {\r\n\t\t\t\t\t_.each( response.data.new_ids.actions, function( newID, oldID ) {\r\n\t\t\t\t\t\tvar action = nfRadio.channel( 'actions' ).request( 'get:action', oldID );\r\n\t\t\t\t\t\tif ( action ) {\r\n\t\t\t\t\t\t\taction.set( 'id', newID );\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t} );\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// If we have a new form id, update the model with the new id.\r\n\t\t\t\tif ( 'undefined' != typeof response.data.new_ids.forms ) {\r\n\t\t\t\t\t_.each( response.data.new_ids.forms, function( newID, oldID ) {\r\n\t\t\t\t\t\tvar formModel = nfRadio.channel( 'app' ).request( 'get:formModel' );\r\n\t\t\t\t\t\tformModel.set( 'id', newID );\r\n\t\t\t\t\t\thistory.replaceState( '', '', 'admin.php?page=ninja-forms&form_id=' + newID );\r\n\t\t\t\t\t} );\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tnfRadio.channel( 'app' ).request( 'update:setting', 'loading', false );\r\n\t\t\tnfRadio.channel( 'app' ).trigger( 'change:loading' );\r\n\r\n\t\t\t// If we're on mobile, show a notice that we're publishing\r\n\t\t\tif ( nfRadio.channel( 'app' ).request( 'is:mobile' ) ) {\r\n\t\t\t\tnfRadio.channel( 'notices' ).request( 'close', 'publishing' );\r\n\t\t\t}\r\n\t\t\t// Add a notice that we've published.\r\n\t\t\tnfRadio.channel( 'notices' ).request( 'add', 'published', 'Changes Published' );\r\n\t\t\tnfRadio.channel( 'app' ).trigger( 'app:published', response );\r\n\r\n\t\t\t// Mark our app as clean. This will disable the publish button and fire anything else that cares about the state.\r\n\t\t\tnfRadio.channel( 'app' ).request( 'update:setting', 'clean', true );\r\n\t\t}\r\n\t\t\r\n\t});\r\n\r\n\treturn controller;\r\n} );\n","/**\r\n * Listens to our app channel for requests to change the current domain.\r\n *\r\n * The app menu and the main submenu both contain clickable links that change the current domain.\r\n * \r\n * @package Ninja Forms builder\r\n * @subpackage Main App\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'controllers/app/changeDomain',[], function() {\r\n\tvar controller = Marionette.Object.extend( {\r\n\t\tinitialize: function() {\r\n\t\t\t// Listen for both menu and submenu clicks.\r\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'click:menu', this.changeAppDomain );\r\n\t\t\t// Reply to specific requests to change the domain\r\n\t\t\tnfRadio.channel( 'app' ).reply( 'change:currentDomain', this.changeAppDomain, this );\r\n\r\n\t\t\t// Reply to requests to prevent our drawer from closing\r\n\t\t\tnfRadio.channel( 'app' ).reply( 'prevent:changeDomain', this.preventChange, this );\r\n\t\t\t// Reply to requests to enable drawer closing\r\n\t\t\tnfRadio.channel( 'app' ).reply( 'enable:changeDomain', this.enableChange, this );\r\n\r\n\t\t\t/*\r\n\t\t\t * Object that holds our array of 'prevent change' values.\r\n\t\t\t * We use an array so that registered requests can unregister and not affect each other.\r\n\t\t\t */\r\n\t\t\tthis.objPreventChange = {};\r\n\t\t},\r\n\r\n\t\tchangeAppDomain: function( e, model ) {\r\n\t\t\t/*\r\n\t\t\t * If we have disabled movement between domains, return false.\r\n\t\t\t */\r\n\t\t\tif ( this.maybePreventChange() ) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\r\n\t\t\t/*\r\n\t\t\t * If we are passed a model, use that model.\r\n\t\t\t * Otherwise, get the domain from the event target data.\r\n\t\t\t */ \r\n\t\t\tif ( 'undefined' == typeof model ) {\r\n\t\t\t\tvar domainID = jQuery( e.target ).data( 'domain' );\r\n\t\t\t\tvar model = nfRadio.channel( 'app' ).request( 'get:domainModel', domainID );\r\n\t\t\t}\r\n\t\t\t// If a drawer is open, close it.\r\n\t\t\tif ( nfRadio.channel( 'app' ).request( 'get:currentDrawer' ) ) {\r\n\t\t\t\tnfRadio.channel( 'app' ).request( 'close:drawer' );\r\n\t\t\t}\r\n\t\t\t/*\r\n\t\t\t * If we aren't dealing with an external url (such as preview), update our app data\r\n\t\t\t * and trigger a radio message saying we've changed the domain.\r\n\t\t\t */ \r\n\t\t\tif ( 0 == model.get( 'url' ).length ) {\r\n\t\t\t\tvar mainEl = nfRadio.channel( 'app' ).request( 'get:mainEl' );\r\n\t\t\t\tnfRadio.channel( 'app' ).request( 'update:currentDomain', model );\r\n\t\t\t\tjQuery( mainEl ).scrollTop( 0 );\t\t\t\t\r\n\t\t\t\tnfRadio.channel( 'app' ).trigger( 'change:currentDomain', model );\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\t/**\r\n         * Check to see if anything has registered a key to prevent changing the domain.\r\n         * \r\n         * @since  3.0\r\n         * @return boolean\r\n         */\r\n        maybePreventChange: function() {\r\n        \tif ( 0 == Object.keys( this.objPreventChange ).length ) {\r\n        \t\treturn false;\r\n        \t} else {\r\n        \t\treturn true;\r\n        \t}\r\n        },\r\n\r\n        /**\r\n         * Register a key to prevent changing the domain.\r\n         * \r\n         * @since  3.0\r\n         * @param  string \tkey unique id for our 'prevent change domain' setting.\r\n         * @return void\r\n         */\r\n        preventChange: function( key ) {\r\n        \tthis.objPreventChange[ key ] = true;\r\n        },\r\n\r\n        /**\r\n         * Remove a previously registered key that is preventing our domain from changing.\r\n         * \r\n         * @since  3.0\r\n         * @param  string \tkey unique id for our 'prevent change domain' setting.\r\n         * @return void\r\n         */\r\n        enableChange: function( key ) {\r\n        \tdelete this.objPreventChange[ key ];\r\n        },\r\n\r\n\t});\r\n\r\n\treturn controller;\r\n} );\n","/**\r\n * Modify the user's browser history when they click on a domain\r\n * \r\n * @package Ninja Forms builder\r\n * @subpackage Main App\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'controllers/app/pushstate',[], function() {\r\n\tvar controller = Marionette.Object.extend( {\r\n\t\tinitialize: function() {\r\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'change:currentDomain', this.changePushState );\r\n\t\t},\r\n\r\n\t\tchangePushState: function() {\r\n\t\t\tvar currentDomain = nfRadio.channel( 'app' ).request( 'get:currentDomain' );\r\n\t\t\thistory.pushState( null, null, window.location.href + '&domain=' + currentDomain.get( 'id' ) );\r\n\t\t\tvar reExp = /domain=\\\\d+/;\r\n\t\t\tvar url = window.location.toString();\r\n\t\t\tvar newUrl = url.replace( reExp, '' );\r\n\t\t\tconsole.log( newUrl );\r\n\t\t}\r\n\r\n\t});\r\n\r\n\treturn controller;\r\n} );\n","/**\r\n * Handles our hotkey execution. Needs to be cleaned up and made more programmatic.\r\n * \r\n * Our hotkeys are defined by the domain that we're currently viewing. In each domain's model, there is a hotkey object.\r\n * \r\n * Currently too much hotkey data is hard-coded here.\r\n * \r\n * @package Ninja Forms builder\r\n * @subpackage Fields\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'controllers/app/hotkeys',[], function() {\r\n\tvar controller = Marionette.Object.extend( {\r\n\t\tinitialize: function() {\r\n\t\t\t// When we change our domain, change the hotkeys to those within that object.\r\n\t\t\tthis.listenTo( nfRadio.channel( 'main' ), 'render:main', this.changeHotkeys );\r\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer' ), 'opened', this.changeHotkeys );\r\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer' ), 'render:settingGroup', this.changeHotkeys );\r\n\t\t\t// Currently, these are the functions that run when the new field or new action hotkey is pressed.\r\n\t\t\t// TODO: move these into a config module or into something more programmatic and scalable.\r\n\t\t\tthis.listenTo( nfRadio.channel( 'hotkeys' ), 'add:newField', this.addNewField );\r\n\t\t\tthis.listenTo( nfRadio.channel( 'hotkeys' ), 'add:newAction', this.addNewAction );\r\n\t\t\t// Same as above, these functions need to be moved into a more modular/programmatic solution.\r\n\t\t\tthis.listenTo( nfRadio.channel( 'hotkeys' ), 'changeDomain:fields', this.changeDomainFields );\r\n\t\t\tthis.listenTo( nfRadio.channel( 'hotkeys' ), 'changeDomain:actions', this.changeDomainActions );\r\n\t\t\tthis.listenTo( nfRadio.channel( 'hotkeys' ), 'changeDomain:settings', this.changeDomainSettings );\r\n\t\t\tthis.listenTo( nfRadio.channel( 'hotkeys' ), 'close:drawer', this.closeDrawer );\r\n\t\t},\r\n\r\n\t\tchangeHotkeys: function() {\r\n\t\t\tvar currentDomain = nfRadio.channel( 'app' ).request( 'get:currentDomain' );\r\n\t\t\tjQuery( document ).off( '.nfDomainHotkeys' );\r\n\t\t\tjQuery( 'input' ).off( '.nfDomainHotkeys' );\r\n\t\t\tif ( currentDomain.get( 'hotkeys' ) ) {\r\n\t\t\t\tjQuery.each( currentDomain.get( 'hotkeys' ), function( hotkey, msg ) {\r\n\t\t\t\t\tjQuery( document ).on( 'keydown.nfDomainHotkeys', null, hotkey, function( e ) {\r\n\t\t\t\t\t\tnfRadio.channel( 'hotkeys' ).trigger( msg, e );\r\n\t\t\t\t\t} );\r\n\t\t\t\t\tjQuery( 'input' ).on( 'keydown.nfDomainHotkeys', null, hotkey, function( e ) {\r\n\t\t\t\t\t\tnfRadio.channel( 'hotkeys' ).trigger( msg, e );\r\n\t\t\t\t\t} );\r\n\t\t\t\t\tjQuery( 'textarea' ).on( 'keydown.nfDomainHotkeys', null, hotkey, function( e ) {\r\n\t\t\t\t\t\tnfRadio.channel( 'hotkeys' ).trigger( msg, e );\r\n\t\t\t\t\t} );\r\n\t\t\t\t} );\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\taddNewField: function() {\r\n\t\t\tif ( 'addField' != nfRadio.channel( 'app' ).request( 'get:currentDrawer' ) ) {\r\n\t\t\t\tnfRadio.channel( 'app' ).request( 'open:drawer', 'addField' );\r\n\t\t\t} else {\r\n\t\t\t\tnfRadio.channel( 'app' ).request( 'close:drawer' );\r\n\t\t\t}\r\n\t\t\t\r\n\t\t},\r\n\r\n\t\taddNewAction: function() {\r\n\t\t\tif ( 'addAction' != nfRadio.channel( 'app' ).request( 'get:currentDrawer' ) ) {\r\n\t\t\t\tnfRadio.channel( 'app' ).request( 'open:drawer', 'addAction' );\r\n\t\t\t} else {\r\n\t\t\t\tnfRadio.channel( 'app' ).request( 'close:drawer' );\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\tchangeDomainFields: function() {\r\n\t\t\tvar appDomainCollection = nfRadio.channel( 'app' ).request( 'get:domainCollection' );\r\n\t\t\tvar fieldsDomain = appDomainCollection.get( 'fields' );\r\n\t\t\tnfRadio.channel( 'app' ).request( 'change:currentDomain', {}, fieldsDomain );\r\n\t\t},\r\n\r\n\t\tchangeDomainActions: function() {\r\n\t\t\tvar appDomainCollection = nfRadio.channel( 'app' ).request( 'get:domainCollection' );\r\n\t\t\tvar actionsDomain = appDomainCollection.get( 'actions' );\r\n\t\t\tnfRadio.channel( 'app' ).request( 'change:currentDomain', {}, actionsDomain );\r\n\t\t},\r\n\r\n\t\tchangeDomainSettings: function() {\r\n\t\t\tvar appDomainCollection = nfRadio.channel( 'app' ).request( 'get:domainCollection' );\r\n\t\t\tvar settingsDomain = appDomainCollection.get( 'settings' );\r\n\t\t\tnfRadio.channel( 'app' ).request( 'change:currentDomain', {}, settingsDomain );\r\n\t\t},\r\n\r\n\t\tcloseDrawer: function() {\r\n\t\t\tnfRadio.channel( 'app' ).request( 'close:drawer' );\r\n\t\t}\r\n\r\n\t});\r\n\r\n\treturn controller;\r\n} );\n","/**\r\n * Change the clean state of our app when settings are changed.\r\n * \r\n * @package Ninja Forms builder\r\n * @subpackage Main App\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'controllers/app/cleanState',[], function() {\r\n\tvar controller = Marionette.Object.extend( {\r\n\t\tinitialize: function() {\r\n\t\t\t/*\r\n\t\t\t * Set an array of field model attributes to ignore.\r\n\t\t\t * This list will be filtered just before we ignore anything.\r\n\t\t\t */ \r\n\t\t\tthis.ignoreAttributes = [\r\n\t\t\t\t'editActive'\r\n\t\t\t];\r\n\r\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'update:setting', this.setAppClean );\r\n\t\t},\r\n\r\n\t\tsetAppClean: function( model ) {\r\n\t\t\tfor( var attr in model.changedAttributes() ) {\r\n\t\t\t\tvar changedAttr = attr;\r\n\t\t\t\tvar after = model.changedAttributes()[ attr ];\r\n\t\t\t}\r\n\r\n\t\t\tvar ignoreAttributes = nfRadio.channel( 'undo-' + model.get( 'type' ) ).request( 'ignore:attributes', this.ignoreAttributes ) || this.ignoreAttributes;\r\n\t\t\t\r\n\t\t\tif ( -1 != this.ignoreAttributes.indexOf( attr ) ) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tnfRadio.channel( 'app' ).request( 'update:setting', 'clean', false );\r\n\t\t}\r\n\r\n\t});\r\n\r\n\treturn controller;\r\n} );\n","/**\r\n * All of the core undo functions. Listens on the 'changes' channel for an undo request.\r\n * \r\n * @package Ninja Forms builder\r\n * @subpackage Main App\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'controllers/app/coreUndo',[], function() {\r\n\tvar controller = Marionette.Object.extend( {\r\n\t\tinitialize: function() {\r\n\t\t\tnfRadio.channel( 'changes' ).reply( 'undo:changeSetting', this.undoChangeSetting, this );\r\n\t\t\tnfRadio.channel( 'changes' ).reply( 'undo:addObject', this.undoAddObject, this );\r\n\t\t\tnfRadio.channel( 'changes' ).reply( 'undo:removeObject', this.undoRemoveObject, this );\r\n\t\t\tnfRadio.channel( 'changes' ).reply( 'undo:duplicateObject', this.undoDuplicateObject, this );\r\n\r\n\t\t\tnfRadio.channel( 'changes' ).reply( 'undo:sortFields', this.undoSortFields, this );\r\n\t\t\tnfRadio.channel( 'changes' ).reply( 'undo:addListOption', this.undoAddListOption, this );\r\n\t\t\tnfRadio.channel( 'changes' ).reply( 'undo:removeListOption', this.undoRemoveListOption, this );\r\n\t\t\tnfRadio.channel( 'changes' ).reply( 'undo:sortListOptions', this.undoSortListOptions, this );\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Undo settings that have been changed.\r\n\t\t * \r\n\t\t * @since  3.0\r\n\t\t * @param  backbone.model \tchange \tmodel of our change\r\n\t\t * @param  boolean \t\t\tundoAll are we in the middle of an undo all action?\r\n\t\t * @return void\r\n\t\t */\r\n\t\tundoChangeSetting: function( change, undoAll ) {\r\n\t\t\tvar fieldModel = change.get( 'model' );\r\n\t\t\tvar changes = change.get( 'changes' );\r\n\t\t\tvar attr = changes.attr;\r\n\t\t\tvar before = changes.before;\r\n\t\t\tfieldModel.set( attr, before );\r\n\t\t\tthis.maybeRemoveChange( change, undoAll );\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Undo adding a field or an action.\r\n\t\t * Loops through our change collection and removes any change models based upon the one we're removing.\r\n\t\t * \r\n\t\t * @since  3.0\r\n\t\t * @param  backbone.model \tchange \tmodel of our change\r\n\t\t * @param  boolean \t\t\tundoAll are we in the middle of an undo all action?\r\n\t\t * @return void\r\n\t\t */\r\n\t\tundoAddObject: function( change, undoAll ) {\r\n\t\t\tvar objectModel = change.get( 'model' );\r\n\t\t\tvar collection = change.get( 'data' ).collection;\r\n\r\n\t\t\tif ( 'undefined' != typeof collection.newIDs ) {\r\n\t\t\t\tdelete collection.newIDs[ objectModel.get( 'id' ) ];\r\n\t\t\t}\r\n\t\t\t\t\t\t\r\n\t\t\tif ( ! undoAll ) {\r\n\t\t\t\tvar changeCollection = nfRadio.channel( 'changes' ).request( 'get:collection' );\r\n\t\t\t\tvar results = changeCollection.where( { model: objectModel } );\r\n\r\n\t\t\t\t_.each( results, function( model ) {\r\n\t\t\t\t\tif ( model !== change ) {\r\n\t\t\t\t\t\tchangeCollection.remove( model );\r\n\t\t\t\t\t}\r\n\t\t\t\t} );\t\t\t\t\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tcollection.remove( objectModel );\r\n\t\t\tthis.maybeRemoveChange( change, undoAll );\r\n\t\t},\t\t\r\n\r\n\t\t/**\r\n\t\t * Undo adding a field or an action.\r\n\t\t * Loops through our change collection and removes any change models based upon the one we're removing.\r\n\t\t * \r\n\t\t * @since  3.0\r\n\t\t * @param  backbone.model \tchange \tmodel of our change\r\n\t\t * @param  boolean \t\t\tundoAll are we in the middle of an undo all action?\r\n\t\t * @return void\r\n\t\t */\r\n\t\tundoDuplicateObject: function( change, undoAll ) {\r\n\t\t\tvar objectModel = change.get( 'model' );\r\n\t\t\tvar objectCollection = change.get( 'data' ).collection;\r\n\r\n\t\t\tif ( ! undoAll ) {\r\n\t\t\t\tvar changeCollection = nfRadio.channel( 'changes' ).request( 'get:collection' );\r\n\t\t\t\tvar results = changeCollection.where( { model: objectModel } );\r\n\r\n\t\t\t\t_.each( results, function( model ) {\r\n\t\t\t\t\tif ( model !== change ) {\r\n\t\t\t\t\t\tchangeCollection.remove( model );\r\n\t\t\t\t\t}\r\n\t\t\t\t} );\r\n\t\t\t}\r\n\r\n\t\t\tobjectCollection.remove( objectModel );\r\n\t\t\tthis.maybeRemoveChange( change, undoAll );\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Undo removing a field or an action.\r\n\t\t * \r\n\t\t * @since  3.0\r\n\t\t * @param  backbone.model \tchange \tmodel of our change\r\n\t\t * @param  boolean \t\t\tundoAll are we in the middle of an undo all action?\r\n\t\t * @return void\r\n\t\t */\r\n\t\tundoRemoveObject: function( change, undoAll ) {\r\n\t\t\tvar dataModel = change.get( 'model' );\r\n\t\t\tvar collection = change.get( 'data' ).collection;\r\n\r\n\t\t\tnfRadio.channel( dataModel.get( 'objectDomain' ) ).request( 'add', dataModel );\r\n\r\n\t\t\tdelete collection.removedIDs[ dataModel.get( 'id' ) ];\r\n\t\t\t\r\n\t\t\tif ( ! undoAll ) {\r\n\t\t\t\tvar changeCollection = nfRadio.channel( 'changes' ).request( 'get:collection' );\r\n\t\t\t\tvar results = changeCollection.where( { model: dataModel } );\r\n\r\n\t\t\t\t_.each( results, function( model ) {\r\n\t\t\t\t\tif ( model !== change ) {\r\n\t\t\t\t\t\tmodel.set( 'disabled', false );\r\n\t\t\t\t\t}\r\n\t\t\t\t} );\t\t\t\t\r\n\t\t\t}\r\n\r\n\t\t\t// Trigger a reset on our field collection so that our view re-renders\r\n\t\t\tcollection.trigger( 'reset', collection );\r\n\r\n\t\t\tthis.maybeRemoveChange( change, undoAll );\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Undo field sorting.\r\n\t\t * \r\n\t\t * @since  3.0\r\n\t\t * @param  backbone.model \tchange \tmodel of our change\r\n\t\t * @param  boolean \t\t\tundoAll are we in the middle of an undo all action?\r\n\t\t * @return void\r\n\t\t */\r\n\t\tundoSortFields: function( change, undoAll ) {\r\n\t\t\tvar data = change.get( 'data' );\r\n\t\t\tvar fields = data.fields;\r\n\r\n\t\t\tvar fieldCollection = nfRadio.channel( 'fields' ).request( 'get:collection' );\r\n\t\t\t_.each( fields, function( changeModel ) {\r\n\t\t\t\tvar before = changeModel.before;\r\n\t\t\t\tvar fieldModel = changeModel.model;\r\n\t\t\t\tfieldModel.set( 'order', before );\r\n\t\t\t\t// console.log( 'set ' + fieldModel.get( 'label' ) + ' to ' + before );\r\n\t\t\t} );\r\n\t\t\t// console.log( fieldCollection.where( { label: 'Name' } ) );\r\n\t\t\t// console.log( fieldCollection.where( { label: 'Email' } ) );\r\n\r\n\r\n\t\t\tfieldCollection.sort();\r\n\t\t\tthis.maybeRemoveChange( change, undoAll );\r\n\t\t},\r\n\r\n\t\tundoAddListOption: function( change, undoAll ) {\r\n\t\t\tvar model = change.get( 'model' );\r\n\r\n\t\t\tif ( ! undoAll ) {\r\n\t\t\t\tvar changeCollection = nfRadio.channel( 'changes' ).request( 'get:collection' );\r\n\t\t\t\tvar results = changeCollection.where( { model: model } );\r\n\r\n\t\t\t\t_.each( results, function( changeModel ) {\r\n\t\t\t\t\tif ( changeModel !== change ) {\r\n\t\t\t\t\t\tchangeCollection.remove( changeModel );\r\n\t\t\t\t\t}\r\n\t\t\t\t} );\t\t\t\t\r\n\t\t\t}\r\n\r\n\t\t\tmodel.collection.remove( model );\r\n\t\t\tthis.maybeRemoveChange( change, undoAll );\r\n\t\t},\r\n\r\n\t\tundoRemoveListOption: function( change, undoAll ) {\r\n\t\t\tvar model = change.get( 'model' );\r\n\t\t\tvar collection = change.get( 'data' ).collection;\r\n\t\t\tcollection.add( model );\r\n\r\n\t\t\tif ( ! undoAll ) {\r\n\t\t\t\tvar changeCollection = nfRadio.channel( 'changes' ).request( 'get:collection' );\r\n\t\t\t\tvar results = changeCollection.where( { model: model } );\r\n\r\n\t\t\t\t_.each( results, function( model ) {\r\n\t\t\t\t\tif ( model !== change ) {\r\n\t\t\t\t\t\tmodel.set( 'disabled', false );\r\n\t\t\t\t\t}\r\n\t\t\t\t} );\t\t\t\t\r\n\t\t\t}\r\n\r\n\t\t\tthis.maybeRemoveChange( change, undoAll );\r\n\t\t},\r\n\r\n\t\tundoSortListOptions: function( change, undoAll ) {\r\n\t\t\tvar data = change.get( 'data' );\r\n\t\t\tvar collection = data.collection;\r\n\t\t\t\r\n\t\t\tvar objModels = data.objModels;\r\n\r\n\t\t\t_.each( objModels, function( changeModel ) {\r\n\t\t\t\tvar before = changeModel.before;\r\n\t\t\t\tvar optionModel = changeModel.model;\r\n\t\t\t\toptionModel.set( 'order', before );\r\n\t\t\t} );\t\t\t\t\r\n\r\n\r\n\t\t\tcollection.sort();\r\n\t\t\tthis.maybeRemoveChange( change, undoAll );\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * If our undo action was requested to 'remove' the change from the collection, remove it.\r\n\t\t * \r\n\t\t * @since  3.0\r\n\t\t * @param  backbone.model \tchange \tmodel of our change\r\n\t\t * @param  boolean \t\t\tremove \tshould we remove this item from our change collection\r\n\t\t * @return void\r\n\t\t */\r\n\t\tmaybeRemoveChange: function( change, undoAll ) {\t\t\t\r\n\t\t\tvar undoAll = typeof undoAll !== 'undefined' ? undoAll : false;\r\n\t\t\tif ( ! undoAll ) {\r\n\t\t\t\t// Update preview.\r\n\t\t\t\tnfRadio.channel( 'app' ).request( 'update:db' );\r\n\t\t\t\tvar changeCollection = nfRadio.channel( 'changes' ).request( 'get:collection' );\r\n\t\t\t\tchangeCollection.remove( change );\r\n\t\t\t\tif ( 0 == changeCollection.length ) {\r\n\t\t\t\t\tnfRadio.channel( 'app' ).request( 'update:setting', 'clean', true );\r\n\t\t\t\t\tnfRadio.channel( 'app' ).request( 'close:drawer' );\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t});\r\n\r\n\treturn controller;\r\n} );\n","/**\r\n * Returns a clone of a backbone model with all the attributes looped through so that collections contained within are propely cloned.\r\n * \r\n * @package Ninja Forms builder\r\n * @subpackage Main App\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'controllers/app/cloneModelDeep',[], function() {\r\n\tvar controller = Marionette.Object.extend( {\r\n\t\tinitialize: function() {\r\n\t\t\tnfRadio.channel( 'app' ).reply( 'clone:modelDeep', this.cloneModelDeep, this );\r\n\t\t},\r\n\r\n\t\tcloneModelDeep: function( model ) {\r\n\t\t\t// Temporary value used to store any new collections.\r\n\t\t\tvar replace = {};\r\n\t\t\t// Loop over every model attribute and if we find a collection, clone each model and instantiate a new collection.\r\n\t\t\t_.each( model.attributes, function( val, key ) {\r\n\t\t\t\tif( val instanceof Backbone.Collection ) { // Is this a backbone collection?\r\n\t\t\t\t\tvar clonedCollection = nfRadio.channel( 'app' ).request( 'clone:collectionDeep', val );\r\n\t\t\t\t\treplace[ key ] = clonedCollection;\r\n\t\t\t\t} else if ( val instanceof Backbone.Model ) { // Is this a backbone model?\r\n\t\t\t\t\treplace[ key ] = this.cloneModelDeep( val );\r\n\t\t\t\t}\r\n\t\t\t}, this );\r\n\r\n\t\t\t// Clone our original model\r\n\t\t\tvar newModel = model.clone();\r\n\t\t\t// Overwrite any collections we created above.\r\n\t\t\t_.each( replace, function( val, key ) {\r\n\t\t\t\tnewModel.set( key, val );\r\n\t\t\t} );\r\n\r\n\t\t\treturn newModel;\r\n\t\t}\r\n\t});\r\n\r\n\treturn controller;\r\n} );\n","/**\r\n * Returns the appropriate child view for our settings drawer.\r\n *\r\n * This enables settings types to register custom childviews for their settings.\r\n * The option-repeater setting for the list field is an example.\r\n * \r\n * @package Ninja Forms builder\r\n * @subpackage App - Edit Settings Drawer\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'controllers/app/getSettingChildView',['views/app/drawer/itemSetting'], function( itemSettingView ) {\r\n\tvar controller = Marionette.Object.extend( {\r\n\t\tinitialize: function() {\r\n\t\t\t// Respond to requests for field settings child views.\r\n\t\t\tnfRadio.channel( 'app' ).reply( 'get:settingChildView', this.getSettingChildView, this );\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Return the appropriate child setting view.\r\n\t\t *\r\n\t\t * @since  3.0\r\n\t\t * @param  backbone.model\tmodel \tField setting\r\n\t\t * @return backbone.view\r\n\t\t */\r\n\t\tgetSettingChildView: function( model ) {\r\n\t\t\t// Get our setting type.\r\n\t\t\tvar type = model.get( 'type' );\r\n\t\t\t// Request a setting childview from our setting type channel. (Setting type, not field type)\r\n\t\t\tvar settingChildView = nfRadio.channel( type ).request( 'get:settingChildView', model ) || itemSettingView;\r\n\t\t\t\r\n\t\t\treturn settingChildView\r\n\t\t}\r\n\r\n\t});\r\n\r\n\treturn controller;\r\n} );\n","/**\r\n * Updates our model when the user changes a setting.\r\n * \r\n * @package Ninja Forms builder\r\n * @subpackage Main App\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'controllers/app/changeSettingDefault',[], function() {\r\n\tvar controller = Marionette.Object.extend( {\r\n\t\tinitialize: function() {\r\n\t\t\t// Respond to requests to update settings.\r\n\t\t\tnfRadio.channel( 'app' ).reply( 'change:setting', this.changeSetting, this );\r\n\r\n\t\t\t// Listen on our app channel for the change setting event. Fired by the setting view.\r\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'change:setting', this.changeSetting, this );\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * When we change our setting, update the model.\r\n\t\t * \r\n\t\t * @since  3.0\r\n\t\t * @param  Object \t\t\te                event\r\n\t\t * @param  backbone.model \tsettingModel model that holds our field type settings info\r\n\t\t * @param  backbone.model \tdataModel       model that holds our field settings\r\n\t\t * @return void\r\n\t\t */\r\n\t\tchangeSetting: function( e, settingModel, dataModel, value ) {\r\n\t\t\tvar name = settingModel.get( 'name' );\r\n\t\t\tvar before = dataModel.get( name );\r\n\t\t\tvar value = value || null;\r\n\t\t\tif ( ! value ) {\r\n\t\t\t\t// Sends out a request on the fields-type (fields-text, fields-checkbox, etc) channel to see if that field type needs to return a special value for saving.\r\n\t\t\t\tvalue = nfRadio.channel( settingModel.get( 'type' ) ).request( 'before:updateSetting', e, dataModel, name, settingModel );\r\n\t\t\t}\r\n\r\n\t\t\tif( 'undefined' == typeof value ){\r\n\t\t\t    value = jQuery( e.target ).val();\r\n            }\r\n\t\t\t\r\n\t\t\t// Update our field model with the new setting value.\r\n\t\t\tdataModel.set( name, value, { settingModel: settingModel } );\r\n\t\t\tnfRadio.channel( 'setting-' + name ).trigger( 'after:updateSetting', dataModel, settingModel );\r\n\t\t\t// Register our setting change with our change tracker\r\n\t\t\tvar after = value;\r\n\t\t\t\r\n\t\t\tvar changes = {\r\n\t\t\t\tattr: name,\r\n\t\t\t\tbefore: before,\r\n\t\t\t\tafter: after\r\n\t\t\t}\r\n\r\n\t\t\tvar currentDomain = nfRadio.channel( 'app' ).request( 'get:currentDomain' );\r\n\t\t\tvar currentDomainID = currentDomain.get( 'id' );\r\n\r\n\t\t\tvar label = {\r\n\t\t\t\tobject: dataModel.get( 'objectType' ),\r\n\t\t\t\tlabel: dataModel.get( 'label' ),\r\n\t\t\t\tchange: 'Changed ' + settingModel.get( 'label' ) + ' from ' + before + ' to ' + after\r\n\t\t\t};\r\n\r\n\t\t\tnfRadio.channel( 'changes' ).request( 'register:change', 'changeSetting', dataModel, changes, label );\r\n\t\t}\r\n\r\n\t});\r\n\r\n\treturn controller;\r\n} );\n","define( 'views/app/drawer/typeSettingFieldset',['views/app/drawer/itemSetting'], function( itemSettingView ) {\r\n\tvar view = Marionette.CompositeView.extend( {\r\n\t\ttemplate: '#tmpl-nf-edit-setting-wrap',\r\n\t\tchildView: itemSettingView,\r\n\r\n\t\tinitialize: function( data ) {\r\n\t\t\tthis.collection = this.model.get( 'settings' );\r\n\t\t\tthis.childViewOptions = { dataModel: data.dataModel };\r\n\t\t\tthis.dataModel = data.dataModel;\r\n\t\t\tvar deps = this.model.get( 'deps' );\r\n\t\t\tif ( deps ) {\r\n\t\t\t\tfor ( var name in deps ) {\r\n\t\t\t\t    if ( deps.hasOwnProperty( name ) ) {\r\n\t\t\t\t    \tthis.dataModel.on( 'change:' + name, this.render, this );\r\n\t\t\t\t    }\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tthis.model.on( 'rerender', this.render, this );\r\n\t\t},\r\n\r\n\t\tonBeforeDestroy: function() {\r\n\t\t\tvar deps = this.model.get( 'deps' );\r\n\t\t\tif ( deps ) {\r\n\t\t\t\tfor (var name in deps) {\r\n\t\t\t\t    if ( deps.hasOwnProperty( name ) ) {\r\n\t\t\t\t    \tthis.dataModel.off( 'change:' + name, this.render );\r\n\t\t\t\t    }\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\tonBeforeRender: function() {\r\n\t\t\tnfRadio.channel( 'app' ).trigger( 'before:renderSetting', this.model, this.dataModel );\r\n\t\t\tnfRadio.channel( 'setting-type-' + this.model.get( 'type' ) ).trigger( 'before:renderSetting', this.model, this.dataModel, this );\r\n\t\t\tnfRadio.channel( 'setting-' + this.model.get( 'name' ) ).trigger( 'before:renderSetting', this.model, this.dataModel, this );\r\n\t\t},\r\n\r\n\t\tonRender: function() {\r\n\t\t\t/*\r\n\t\t\t * Send out a radio message.\r\n\t\t\t */\r\n\t\t\tnfRadio.channel( 'setting-' + this.model.get( 'name' ) ).trigger( 'render:setting', this.model, this.dataModel, this );\r\n\t\t\tnfRadio.channel( 'setting-type-' + this.model.get( 'type' ) ).trigger( 'render:setting', this.model, this.dataModel, this );\r\n\t\t},\r\n\r\n\t\ttemplateHelpers: function () {\r\n\t\t\tvar that = this;\r\n\t    \treturn {\r\n\t    \t\trenderVisible: function() {\r\n\t\t\t\t\tif ( this.deps ) {\r\n\t\t\t\t\t\tfor (var name in this.deps) {\r\n\t\t\t\t\t\t    if ( this.deps.hasOwnProperty( name ) ) {\r\n\t\t\t\t\t\t        if ( that.dataModel.get( name ) !== this.deps[ name ] ) {\r\n\t\t\t\t\t\t        \treturn 'style=\"display:none;\"';\r\n\t\t\t\t\t\t        }\r\n\t\t\t\t\t\t    }\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t    \t\t\treturn '';\r\n\t    \t\t},\r\n\t    \t\trenderSetting: function(){\r\n\t    \t\t\tvar setting = nfRadio.channel( 'app' ).request( 'get:template',  '#tmpl-nf-edit-setting-' + this.type );\r\n\t\t\t\t\treturn setting( this );\r\n\t\t\t\t},\r\n\t\t\t\t\r\n\t\t\t\trenderClasses: function() {\r\n\t\t\t\t\tvar classes = '';\r\n\t\t\t\t\tif ( 'undefined' != typeof this.width ) {\r\n\t\t\t\t\t\tclasses += this.width;\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tclasses += ' one-half';\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif ( this.error ) {\r\n\t\t\t\t\t\tclasses += ' nf-error';\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\treturn classes;\r\n\t\t\t\t},\r\n\r\n\t\t\t\trenderError: function() {\r\n\t\t\t\t\tif ( this.error ) {\r\n\t\t\t\t\t\treturn this.error;\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn '';\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\tattachHtml: function( collectionView, childView ) {\r\n\t\t\tjQuery( collectionView.el ).find( '.nf-field-sub-settings' ).append( childView.el );\r\n\t\t}\r\n\t} );\r\n\r\n\treturn view;\r\n} );\n","/**\r\n * Model that represents our setting.\r\n *\r\n * When the model is created, we trigger the init event in two radio channels.\r\n *\r\n * This lets specific types of settings modify the model before anything uses it.\r\n *\r\n * Fieldset, for instance, uses this hook to instantiate its settings as a collection.\r\n * \r\n * @package Ninja Forms builder\r\n * @subpackage App\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'models/app/settingModel',[], function() {\r\n\tvar model = Backbone.Model.extend( {\r\n\t\tdefaults: {\r\n\t\t\tsettings: false,\r\n\t\t\thide_merge_tags: false,\r\n\t\t\terror: false\r\n\t\t},\r\n\r\n\t\tinitialize: function() {\r\n\t\t\t// Send out two messages saying that we've initialized a setting model.\r\n\t\t\tnfRadio.channel( 'app' ).trigger( 'init:settingModel', this );\r\n\t\t\tnfRadio.channel( this.get( 'type' ) ).trigger( 'init:settingModel', this );\r\n\t\t\tnfRadio.channel( 'setting-name-' + this.get( 'name' ) ).trigger( 'init:settingModel', this );\r\n\t\t\tthis.on( 'change:error', this.maybePreventUI, this );\r\n\r\n\t\t\t/*\r\n\t\t\t * If we have an objectType set on our collection, then we're creating a model for the generic settings collection.\r\n\t\t\t * If we're using merge tags in this setting\r\n\t\t\t */\r\n\t\t\tif( 'undefined' == typeof this.collection ) return;\r\n\r\n\t\t\tif ( this.get( 'use_merge_tags' ) && 'undefined' != typeof this.collection.options.objectType ) {\r\n\t\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'update:fieldKey', this.updateKey );\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * When a field key is updated, send out a radio message requesting that this setting be checked for the old key.\r\n\t\t * We want to send the message on the objectType channel.\r\n\t\t * This means that if this setting is for fields, it will trigger on the fields channel, actions, etc.\r\n\t\t * \r\n\t\t * @since  3.0\r\n\t\t * @param  Backbone.Model \tkeyModel data model representing the field for which the key just changed\r\n\t\t * @return void\r\n\t\t */\r\n\t\tupdateKey: function( keyModel ) {\r\n\t\t\tnfRadio.channel( 'app' ).trigger( 'fire:updateFieldKey', keyModel, this );\r\n\t\t},\r\n\r\n\t\tmaybePreventUI: function() {\r\n\t\t\tif ( this.get( 'error' ) ) {\r\n\t\t\t\tnfRadio.channel( 'drawer' ).request( 'prevent:close', 'setting-' + this.get( 'name' ) + '-error' );\r\n\t\t\t\tnfRadio.channel( 'app' ).request( 'prevent:changeDomain', 'setting-' + this.get( 'name' ) + '-error' );\t\t\t\t\r\n\t\t\t} else {\r\n\t\t\t\tnfRadio.channel( 'drawer' ).request( 'enable:close', 'setting-' + this.get( 'name' ) + '-error' );\r\n\t\t\t\tnfRadio.channel( 'app' ).request( 'enable:changeDomain', 'setting-' + this.get( 'name' ) + '-error' );\r\n\t\t\t}\r\n\t\t}\r\n\t} );\r\n\t\r\n\treturn model;\r\n} );\n","/**\r\n * Collections of settings for each field type.\r\n * \r\n * @package Ninja Forms builder\r\n * @subpackage Fields\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'models/app/settingCollection',['models/app/settingModel'], function( settingModel ) {\r\n\tvar collection = Backbone.Collection.extend( {\r\n\t\tmodel: settingModel,\r\n\r\n\t\tinitialize: function( models, options ) {\r\n\t\t\tthis.options = options || {};\r\n\t\t}\r\n\t} );\r\n\treturn collection;\r\n} );\n","/**\r\n * Handles actions related to field settings that use a fieldset\r\n * \r\n * @package Ninja Forms builder\r\n * @subpackage Fields - Edit Field Drawer\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'controllers/app/fieldset',['views/app/drawer/typeSettingFieldset','models/app/settingCollection'], function( fieldsetView, settingCollection ) {\r\n\tvar controller = Marionette.Object.extend( {\r\n\t\tinitialize: function() {\r\n\t\t\tnfRadio.channel( 'fieldset' ).reply( 'get:settingChildView', this.getSettingChildView, this );\r\n\t\t\t// When a list type field is initialized, create an option collection.\r\n\t\t\tthis.listenTo( nfRadio.channel( 'fieldset' ), 'init:settingModel', this.createSettingsCollection );\r\n\t\t},\r\n\r\n\t\tgetSettingChildView: function( model ) {\r\n\t\t\treturn fieldsetView;\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Instantiate settings collection when a fieldset type is initialized.\r\n\t\t * \r\n\t\t * @since  3.0\r\n\t\t * @param  backbone.model \tmodel \tfield model being initialized\r\n\t\t * @return void\r\n\t\t */\r\n\t\tcreateSettingsCollection: function( model ) {\r\n\t\t\tmodel.set( 'settings', new settingCollection( model.get( 'settings' ) ) );\r\n\t\t},\r\n\r\n\t});\r\n\r\n\treturn controller;\r\n} );\n","/**\r\n * Handles actions related to our toggle field.\r\n * When we change the toggle, the setting value will be 'on' or ''.\r\n * We need to change this to 1 or 0.\r\n * \r\n * @package Ninja Forms builder\r\n * @subpackage Fields - Edit Field Drawer\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'controllers/app/toggleSetting',[], function() {\r\n\tvar controller = Marionette.Object.extend( {\r\n\t\tinitialize: function() {\r\n\t\t\t// We don't want the RTE setting to re-render when the value changes.\r\n\t\t\tnfRadio.channel( 'setting-type-toggle' ).reply( 'renderOnChange', function(){ return false } );\r\n\r\n\t\t\t// Respond to requests for field setting filtering.\r\n\t\t\tnfRadio.channel( 'toggle' ).reply( 'before:updateSetting', this.updateSetting, this );\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Return either 1 or 0, depending upon the toggle position.\r\n\t\t * \r\n\t\t * @since  3.0\r\n\t\t * @param  Object \t\t\te                event\r\n\t\t * @param  backbone.model \tfieldModel       field model\r\n\t\t * @param  string \t\t\tname             setting name\r\n\t\t * @param  backbone.model \tsettingTypeModel field type model\r\n\t\t * @return int              1 or 0\r\n\t\t */\r\n\t\tupdateSetting: function( e, fieldModel, name, settingTypeModel ) {\r\n\t\t\tif ( jQuery( e.target ).attr( 'checked' ) ) {\r\n\t\t\t\tvar value = 1;\r\n\t\t\t} else {\r\n\t\t\t\tvar value = 0;\r\n\t\t\t}\r\n\r\n\t\t\treturn value;\r\n\t\t}\r\n\r\n\t});\r\n\r\n\treturn controller;\r\n} );\n","/**\r\n * Listens for clicks on our action item action buttons.\r\n * \r\n * @package Ninja Forms builder\r\n * @subpackage Fields - Main Sortable\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'controllers/app/itemControls',[], function() {\r\n\tvar controller = Marionette.Object.extend( {\r\n\t\tinitialize: function() {\r\n\t\t\t// Listen for clicks to edit, delete, duplicate actions.\r\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'click:edit', this.clickEdit );\r\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'click:delete', this.clickDelete );\r\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'click:duplicate', this.clickDuplicate );\r\n\r\n\t\t\t// Listen for our drawer close and remove our active edit state\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Open a drawer with our action model for editing settings.\r\n\t\t * \r\n\t\t * @since  3.0\r\n\t\t * @param  Object\t\t\te     \tevent\r\n\t\t * @param  backbone.model \tmodel \taction model\r\n\t\t * @return void\r\n\t\t */\r\n\t\tclickEdit: function( e, model ) {\r\n\t\t\tvar currentDomain = nfRadio.channel( 'app' ).request( 'get:currentDomain' );\r\n\t\t\tvar currentDomainID = currentDomain.get( 'id' );\r\n\t\t\tvar type = nfRadio.channel( currentDomainID ).request( 'get:type' , model.get( 'type' ) );\r\n\t\t\tnfRadio.channel( 'app' ).request( 'open:drawer', 'editSettings', { model: model, groupCollection: type.get( 'settingGroups' ) } );\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Delete a action model from our collection\r\n\t\t * \r\n\t\t * @since  3.0\r\n\t\t * @param  Object\t\t\te     \tevent\r\n\t\t * @param  backbone.model \tmodel \taction model\r\n\t\t * @return void\r\n\t\t */\r\n\t\tclickDelete: function( e, dataModel ) {\r\n\t\t\tvar newModel = nfRadio.channel( 'app' ).request( 'clone:modelDeep', dataModel );\r\n\r\n\t\t\t// Add our action deletion to our change log.\r\n\t\t\tvar label = {\r\n\t\t\t\tobject: dataModel.get( 'objectType' ),\r\n\t\t\t\tlabel: dataModel.get( 'label' ),\r\n\t\t\t\tchange: 'Removed',\r\n\t\t\t\tdashicon: 'dismiss'\r\n\t\t\t};\r\n\r\n\t\t\tvar data = {\r\n\t\t\t\tcollection: dataModel.collection\r\n\t\t\t};\r\n\r\n\t\t\tvar changeCollection = nfRadio.channel( 'changes' ).request( 'get:collection' );\r\n\t\t\tvar results = changeCollection.where( { model: dataModel } );\r\n\r\n\t\t\t_.each( results, function( changeModel ) {\r\n\t\t\t\tvar data = changeModel.get( 'data' );\r\n\t\t\t\tif ( 'undefined' != typeof data.fields ) {\r\n\t\t\t\t\t_.each( data.fields, function( field, index ) {\r\n\t\t\t\t\t\tif ( field.model == dataModel ) {\r\n\t\t\t\t\t\t\tdata.fields[ index ].model = newModel;\t\t\t\t\t\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t} );\r\n\t\t\t\t}\r\n\t\t\t\tchangeModel.set( 'data', data );\r\n\t\t\t\tchangeModel.set( 'model', newModel );\r\n\t\t\t\tchangeModel.set( 'disabled', true );\r\n\t\t\t} );\r\n\r\n\t\t\tnfRadio.channel( 'changes' ).request( 'register:change', 'removeObject', newModel, null, label, data );\r\n\t\t\t\r\n\t\t\tvar currentDomain = nfRadio.channel( 'app' ).request( 'get:currentDomain' );\r\n\t\t\tvar currentDomainID = currentDomain.get( 'id' );\r\n\t\t\tnfRadio.channel( currentDomainID ).request( 'delete', dataModel );\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Duplicate a action within our collection, adding the word \"copy\" to the label.\r\n\t\t * \r\n\t\t * @since  3.0\r\n\t\t * @param  Object\t\t\te     \tevent\r\n\t\t * @param  backbone.model \tmodel \taction model\r\n\t\t * @return void\r\n\t\t */\r\n\t\tclickDuplicate: function( e, model ) {\r\n\t\t\tvar newModel = nfRadio.channel( 'app' ).request( 'clone:modelDeep', model );\r\n\t\t\tvar currentDomain = nfRadio.channel( 'app' ).request( 'get:currentDomain' );\r\n\t\t\tvar currentDomainID = currentDomain.get( 'id' );\r\n\r\n\t\t\t// Change our label.\r\n\t\t\tnewModel.set( 'label', newModel.get( 'label' ) + ' Copy' );\r\n\t\t\t// Update our ID to the new tmp id.\r\n\t\t\tvar tmpID = nfRadio.channel( currentDomainID ).request( 'get:tmpID' );\r\n\t\t\tnewModel.set( 'id', tmpID );\r\n\t\t\t// Add new model.\r\n\t\t\t// Params are: model, silent, renderTrigger, action\r\n\t\t\tnfRadio.channel( currentDomainID ).request( 'add', newModel, false, false, 'duplicate' );\r\n\t\t\t\r\n\t\t\t// Add our action addition to our change log.\r\n\t\t\tvar label = {\r\n\t\t\t\tobject: model.get( 'objectType' ),\r\n\t\t\t\tlabel: model.get( 'label' ),\r\n\t\t\t\tchange: 'Duplicated',\r\n\t\t\t\tdashicon: 'admin-page'\r\n\t\t\t};\r\n\r\n\t\t\tvar data = {\r\n\t\t\t\tcollection: nfRadio.channel( currentDomainID ).request( 'get:collection' )\r\n\t\t\t}\r\n\r\n\t\t\tnfRadio.channel( 'changes' ).request( 'register:change', 'duplicateObject', newModel, null, label, data );\r\n\t\t\t\r\n\t\t\tmodel.trigger( 'change:label', model );\r\n\r\n\t\t\t// Update preview.\r\n\t\t\tnfRadio.channel( 'app' ).request( 'update:db' );\r\n\t\t}\r\n\r\n\t});\r\n\r\n\treturn controller;\r\n} );\n","/**\r\n * Config file for our merge tags.\r\n *\r\n * this.collection represents all of our registered merge tags.\r\n * \r\n * @package Ninja Forms builder\r\n * @subpackage Main App\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'controllers/app/mergeTags',[\r\n\t'models/app/mergeTagCollection'\r\n\t], function(\r\n\tmergeTagCollection\r\n\t) {\r\n\tvar controller = Marionette.Object.extend( {\r\n\t\tinitialize: function() {\r\n\t\t\tthis.tagSectionCollection = new mergeTagCollection();\r\n\t\t\tvar that = this;\r\n\t\t\t_.each( mergeTags, function( tagSection ) {\r\n\t\t\t\tif ( tagSection.tags ) {\r\n\t\t\t\t\tvar tags = new mergeTagCollection( tagSection.tags );\r\n\t\t\t\t} else {\r\n\t\t\t\t\tvar tags = '';\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthat.tagSectionCollection.add( {\r\n\t\t\t\t\tid: tagSection.id,\r\n\t\t\t\t\tlabel: tagSection.label,\r\n\t\t\t\t\ttags: tags,\r\n\t\t\t\t\tdefault_group: tagSection.default_group\r\n\t\t\t\t} );\r\n\t\t\t} );\r\n\r\n\t\t\tvar fieldTags = this.tagSectionCollection.get( 'fields').get( 'tags' );\r\n\r\n\t\t\tvar fieldCollection = nfRadio.channel( 'fields' ).request( 'get:collection' );\r\n\t\t\t_.each( fieldCollection.models, function( field ) {\r\n\t\t\t\t// TODO: Make this dynamic\r\n\t\t\t\tif ( 'submit' !== field.get( 'type' ) ) {\r\n\t\t\t\t\tfieldTags.add( {\r\n\t\t\t\t\t\tid: field.get( 'id' ),\r\n\t\t\t\t\t\tlabel: field.get( 'label' ),\r\n\t\t\t\t\t\ttag: that.getFieldKeyFormat( field.get( 'key' ) )\r\n\t\t\t\t\t} );\t\t\t\t\t\r\n\t\t\t\t}\r\n\t\t\t} );\r\n\r\n\t\t\tvar calcTags = new mergeTagCollection();\r\n\r\n\t\t\tvar formModel = nfRadio.channel( 'app' ).request( 'get:formModel' );\r\n\t\t\tvar calcCollection = formModel.get( 'settings' ).get( 'calculations' );\r\n\t\t\t_.each( calcCollection.models, function( calcModel ) {\r\n\t\t\t\tcalcTags.add( {\r\n\t\t\t\t\tlabel: calcModel.get( 'name' ),\r\n\t\t\t\t\ttag: '{calc:' + calcModel.get( 'name' ) + '}'\r\n\t\t\t\t} );\r\n\t\t\t} );\r\n\r\n\t\t\tthis.tagSectionCollection.get( 'calcs' ).set( 'tags', calcTags );\r\n\r\n\t\t\tthis.currentElement = {};\r\n\t\t\tthis.settingModel = {};\r\n\t\t\tthis.open = false;\r\n\r\n\t\t\t// Unhook jBox Merge Tag stuff.\r\n\t\t\t// nfRadio.channel( 'mergeTags' ).reply( 'init', this.initMergeTags, this );\r\n\r\n\t\t\tthis.listenTo( nfRadio.channel( 'mergeTags' ), 'click:mergeTag', this.clickMergeTag );\r\n\t\t\tthis.listenTo( nfRadio.channel( 'fields' ), 'add:field', this.addFieldTags );\r\n\t\t\tthis.listenTo( nfRadio.channel( 'fields' ), 'delete:field', this.deleteFieldTags );\r\n\t\t\tthis.listenTo( nfRadio.channel( 'option-repeater-calculations' ), 'update:option', this.updateCalcTags );\r\n\t\t\tthis.listenTo( nfRadio.channel( 'option-repeater-calculations' ), 'remove:option', this.updateCalcTags );\r\n\r\n\t\t\t\r\n\t\t\tnfRadio.channel( 'mergeTags' ).reply( 'update:currentElement', this.updateCurrentElement, this );\r\n\t\t\tnfRadio.channel( 'mergeTags' ).reply( 'update:currentSetting', this.updateCurrentSetting, this );\r\n\r\n\t\t\t// Listen for requests for our mergeTag collection.\r\n\t\t\tnfRadio.channel( 'mergeTags' ).reply( 'get:collection', this.getCollection, this );\r\n\t\t\tnfRadio.channel( 'mergeTags' ).reply( 'get:mergeTag', this.getSectionModel, this );\r\n\r\n\t\t\t// When a field's ID is changed (ie from a tmpID), update the merge tag.\r\n            this.listenTo( nfRadio.channel( 'fieldSetting-id' ), 'update:setting', this.updateID );\r\n\r\n\t\t\t// When we edit a key, check for places that key might be used.\r\n\t\t\tthis.listenTo( nfRadio.channel( 'fieldSetting-key' ), 'update:setting', this.updateKey );\r\n\r\n\t\t\t// Reply to requests to check a data model for a field key when one is updated.\r\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'replace:fieldKey', this.replaceFieldKey );\r\n\r\n\t\t\t// Reply to requests to check a data model for a field key when one is updated.\r\n\t\t\tnfRadio.channel( 'app' ).reply( 'get:fieldKeyFormat', this.getFieldKeyFormat, this );\r\n\r\n\t\t\t/*\r\n\t\t\t * TODO: Hotkey support for adding tags.\r\n\t\t\t *\r\n\t\t\t\r\n\t\t\tthis.listenTo( nfRadio.channel( 'hotkeys' ), 'open:mergeTags', this.openMergeTags );\r\n\t\t\tthis.listenTo( nfRadio.channel( 'hotkeys' ), 'up:mergeTags', this.upMergeTags );\r\n\t\t\tthis.listenTo( nfRadio.channel( 'hotkeys' ), 'down:mergeTags', this.downMergeTags );\r\n\t\t\tthis.listenTo( nfRadio.channel( 'hotkeys' ), 'return:mergeTags', this.returnMergeTags );\r\n\t\t\tnfRadio.channel( 'mergeTags' ).reply( 'update:open', this.updateOpen, this );\r\n\t\t\t*/\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Init merge tags within the passed view.\r\n\t\t * @since  3.0\r\n\t\t * @param  backbone.view view to be searched for merge tags.\r\n\t\t * @return void\r\n\t\t */\r\n\t\tinitMergeTags: function( view ) {\r\n\t\t\tvar mergeTagsView = nfRadio.channel( 'mergeTags' ).request( 'get:view' );\r\n\t\t\tvar that = this;\r\n\t\t\t/*\r\n\t\t\t * Apply merge tags jQuery plugin.\r\n\t\t\t *\r\n\t\t\t * Prevent jBox from being called multiple times on the same element\r\n\t\t\t */\r\n\t\t\tthis.jBoxes = {};\r\n\t\t\tvar that = this;\r\n\r\n\t\t\tjQuery( view.el ).find( '.merge-tags' ).each(function() {\r\n\t\t\t\tif ( 'undefined' == typeof jQuery( this ).data( 'jBox-id' ) ) {\r\n\t\t\t\t\tvar jBox = jQuery( this ).jBox( 'Tooltip', {\r\n\t\t\t\t\t\ttitle: 'Insert Merge Tag',\r\n\t\t\t\t\t\ttrigger: 'click',\r\n\t\t\t\t\t\tposition: {\r\n\t\t\t\t\t\t\tx: 'center',\r\n\t\t\t\t\t\t\ty: 'bottom'\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\tcloseOnClick: 'body',\r\n\t\t\t\t\t\tcloseOnEsc: true,\r\n\t\t\t\t\t\ttheme: 'TooltipBorder',\r\n\t\t\t\t\t\tmaxHeight: 200,\r\n\r\n\t\t\t\t\t\tonOpen: function() {\r\n\t\t\t\t\t\t\tmergeTagsView.reRender( view.model );\r\n\t\t\t\t\t\t\tthis.setContent( jQuery( '.merge-tags-content' ) );\r\n\t\t\t\t\t\t\tvar currentElement = jQuery( this.target ).prev( '.setting' );\r\n\t\t\t\t\t\t\tif ( 0 == currentElement.length ) {\r\n\t\t\t\t\t\t\t\tcurrentElement = jQuery( view.el ).find( '.setting' );\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tthat.updateCurrentSetting( view.model );\r\n\t\t\t\t\t\t\tthat.updateCurrentElement( currentElement );\r\n\t\t\t\t\t\t\t// nfRadio.channel( 'drawer' ).request( 'prevent:close', 'merge-tags' );\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\tonClose: function() {\r\n\t\t\t\t\t\t\t// nfRadio.channel( 'drawer' ).request( 'enable:close', 'merge-tags' );\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t});\r\n\t\t\t\t\t\r\n\t\t\t\t\tjQuery( this ).data( 'jBox-id', jBox.id );\t\t\t\t\t\r\n\t\t\t\t}\r\n\t\t    });\r\n\t\t},\r\n\r\n\t\tclickMergeTag: function( e, tagModel ) {\r\n\t\t\t/*\r\n\t\t\t * TODO: Make this more dynamic.\r\n\t\t\t * Currently, the RTE is the only section that modifies how merge tags work,\r\n\t\t\t * but another type of setting might need to do this in the future.\r\n\t\t\t */\r\n\r\n\t\t\tif( 'undefined' != typeof this.settingModel.get( 'settingModel' ) && 'calculations' == this.settingModel.get( 'settingModel' ).get( 'name' ) ) {\r\n\r\n\t\t\t\tconsole.log( tagModel );\r\n\r\n\t\t\t\tvar currentValue = jQuery( this.currentElement ).val();\r\n\t\t\t\tvar currentPos = jQuery( this.currentElement ).caret();\r\n\t\t\t\tvar newPos = currentPos + tagModel.get( 'tag' ).length;\r\n\r\n\t\t\t\tvar tag = ( 'undefined' != typeof tagModel.get( 'calcTag' ) ) ? tagModel.get( 'calcTag' ) : tagModel.get( 'tag' );\r\n\r\n\t\t\t\tcurrentValue = currentValue.substr( 0, currentPos ) + tag + currentValue.substr( currentPos );\r\n\t\t\t\tjQuery( this.currentElement ).val( currentValue ).caret( newPos ).trigger( 'change' );\r\n\t\t\t} else if( 'rte' == this.settingModel.get( 'type' ) ) {\r\n\t\t\t\tjQuery( this.currentElement ).summernote( 'insertText', tagModel.get( 'tag' ) );\r\n\t\t\t} else {\r\n\t\t\t\tvar currentValue = jQuery( this.currentElement ).val();\r\n\t\t\t\tvar currentPos = jQuery( this.currentElement ).caret();\r\n\t\t\t\tvar newPos = currentPos + tagModel.get( 'tag' ).length;\r\n\t\t\t\tcurrentValue = currentValue.substr( 0, currentPos ) + tagModel.get( 'tag' ) + currentValue.substr( currentPos );\r\n\t\t\t\tjQuery( this.currentElement ).val( currentValue ).caret( newPos ).trigger( 'change' );\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\taddFieldTags: function( fieldModel ) {\r\n\t\t\t// TODO: Make this dynamic\r\n\t\t\tif ( 'submit' !== fieldModel.get( 'type' ) ) {\r\n\t\t\t\tthis.tagSectionCollection.get( 'fields' ).get( 'tags' ).add( {\r\n\t\t\t\t\tid: fieldModel.get( 'id' ),\r\n\t\t\t\t\tlabel: fieldModel.get( 'label' ),\r\n\t\t\t\t\ttag: this.getFieldKeyFormat( fieldModel.get( 'key' ) ),\r\n\t\t\t\t\tcalcTag: this.getFieldKeyFormatCalc( fieldModel.get( 'key' ) )\r\n\t\t\t\t} );\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\tdeleteFieldTags: function( fieldModel ) {\r\n\t\t\tvar fieldID = fieldModel.get( 'id' );\r\n\t\t\tvar tagModel = this.tagSectionCollection.get( 'fields' ).get( 'tags' ).get( fieldID );\r\n\t\t\tthis.tagSectionCollection.get( 'fields' ).get( 'tags' ).remove( tagModel );\r\n\t\t},\r\n\r\n\t\tupdateCalcTags: function( optionModel ) {\r\n\t\t\tvar calcTags = new mergeTagCollection();\r\n\r\n\t\t\tvar formModel = nfRadio.channel( 'app' ).request( 'get:formModel' );\r\n\t\t\tvar calcCollection = formModel.get( 'settings' ).get( 'calculations' );\r\n\r\n\t\t\t_.each( calcCollection.models, function( calc ) {\r\n\t\t\t\tcalcTags.add( {\r\n\t\t\t\t\tlabel: calc.get( 'name' ),\r\n\t\t\t\t\ttag: '{calc:' + calc.get( 'name' ) + '}'\r\n\t\t\t\t} );\r\n\t\t\t} );\r\n\r\n\t\t\tthis.tagSectionCollection.get( 'calcs' ).set( 'tags', calcTags );\r\n\t\t},\r\n\r\n\t\topenMergeTags: function( e ) {\r\n\t\t\tif ( 'TEXTAREA' == jQuery( e.target )[0].tagName || 'INPUT' == jQuery( e.target )[0].tagName ) {\r\n\t\t\t\tjQuery( e.target ).parent().find( '.merge-tags' ).click();\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\treturnMergeTags: function( e ) {\r\n\t\t\tif ( this.open ) {\r\n\t\t\t\te.preventDefault();\r\n\t\t\t\tvar currentModel = this.fields.where( { 'active': true } )[0];\r\n\t\t\t\tif ( currentModel ) {\r\n\t\t\t\t\tthis.clickMergeTag( e, currentModel );\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\tupMergeTags: function( e ) {\r\n\t\t\tif ( this.open ) {\r\n\t\t\t\te.preventDefault();\r\n\t\t\t\tthis.changeActiveTag( 'up' );\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\tdownMergeTags: function( e ) {\r\n\t\t\tif ( this.open ) {\r\n\t\t\t\te.preventDefault();\r\n\t\t\t\tthis.changeActiveTag( 'down' );\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\tchangeActiveTag: function( dir ) {\r\n\t\t\tif ( 'down' == dir ) {\r\n\t\t\t\tvar inc = 1;\r\n\t\t\t} else {\r\n\t\t\t\tvar inc = -1\r\n\t\t\t}\r\n\t\t\t// First, check to see if a field is currently active.\r\n\t\t\tif( 0 < this.fields.where( { 'active': true } ).length ) {\r\n\t\t\t\tvar currentModel = this.fields.where( { 'active': true } )[0];\r\n\t\t\t\tvar currentIndex = this.fields.indexOf( currentModel );\r\n\t\t\t\tcurrentModel.set( 'active', false );\r\n\r\n\t\t\t\tvar nextModel = this.fields.models[ currentIndex + inc ];\r\n\t\t\t\tif ( nextModel ) {\r\n\t\t\t\t\tnextModel.set( 'active', true );\r\n\t\t\t\t} else {\r\n\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t} else if ( 0 < this.fields.where( { 'active': true } ) ) { // There aren't any active fields. Check for active system tags.\r\n\t\t\t\tconsole.log( 'system' );\r\n\t\t\t} else if ( 0 < this.userInfo.where( { 'active': true } ) ) { // No active user info LIs.\r\n\t\t\t\tconsole.log( 'userinfo' );\r\n\t\t\t} else { // No active LIs. We haven't made any active yet, or we've gotten to the bottom of the list.\r\n\t\t\t\t// Make sure that we have fields\r\n\t\t\t\tif ( 0 < this.fields.models.length ) {\r\n\t\t\t\t\t// Set our first field to active.\r\n\t\t\t\t\tthis.fields.models[0].set( 'active', true );\r\n\t\t\t\t} else {\r\n\t\t\t\t\t// Set our first system model to active.\r\n\t\t\t\t\tthis.system.models[0].set( 'active', true );\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\tupdateCurrentElement: function( element ) {\r\n\t\t\tthis.currentElement = element;\r\n\t\t},\r\n\r\n\t\tupdateCurrentSetting: function( settingModel ) {\r\n\t\t\tthis.settingModel = settingModel;\r\n\t\t},\r\n\r\n\t\tgetCollection: function() {\r\n\t\t\treturn this.tagSectionCollection;\r\n\t\t},\r\n\r\n\t\tgetSectionModel: function( id ) {\r\n\t\t\treturn this.tagSectionCollection.get( id );\r\n\t\t},\r\n\r\n\t\tupdateOpen: function( open ) {\r\n\t\t\tthis.open = open;\r\n\t\t\t_.each( this.tagSectionCollection.get( 'fields' ).models, function( model ) {\r\n\t\t\t\tmodel.set( 'active', false );\r\n\t\t\t} );\r\n\t\t},\r\n\r\n\t\t// When a field is published, update the merge tag with the newly assigned ID (as opposed to the tmpID).\r\n        updateID: function( fieldModel ) {\r\n\r\n\t\t\t// Get the formatted merge tag for comparison.\r\n\t\t\tvar targetTag = this.getFieldKeyFormat( fieldModel.get( 'key' ) );\r\n\r\n\t\t\t// Search the field tags for the matching merge tag to be updated.\r\n\t\t\tvar oldTag = this.tagSectionCollection.get( 'fields' ).get( 'tags' ).find( function( fieldMergeTag ){\r\n                return targetTag == fieldMergeTag.get( 'tag' );\r\n            });\r\n\r\n\t\t\t// If no matching tag is found, return early.\r\n\t\t\tif( 'undefined' == typeof oldTag ) return;\r\n\r\n\t\t\t// Update the merge tag with the \"published\" field ID.\r\n\t\t\toldTag.set( 'id', fieldModel.get( 'id' ) );\r\n\t\t},\r\n\r\n\t\tupdateKey: function( fieldModel ) {\r\n\t\t\tvar newKey = fieldModel.get( 'key' );\r\n\t\t\tvar oldTag = this.tagSectionCollection.get( 'fields' ).get( 'tags' ).get( fieldModel.get( 'id' ) );\r\n\t\t\tif ( 'undefined' != typeof oldTag ) {\r\n\t\t\t\toldTag.set( 'tag', this.getFieldKeyFormat( newKey ) );\t\t\t\t\r\n\t\t\t}\r\n\r\n\t\t},\r\n\r\n\t\tgetFieldKeyFormat: function( key ) {\r\n\t\t\treturn '{field:' + key + '}';\r\n\t\t},\r\n\r\n\t\tgetFieldKeyFormatCalc: function( key ) {\r\n\t\t\treturn '{field:' + key + ':calc}';\r\n\t\t},\r\n\r\n\t\treplaceFieldKey: function( dataModel, keyModel, settingModel ) {\r\n            var oldKey = this.getFieldKeyFormat( keyModel._previousAttributes[ 'key' ] );\r\n\t\t\tvar newKey = this.getFieldKeyFormat( keyModel.get( 'key' ) );\r\n\t\t\tvar settingName = settingModel.get( 'name' );\r\n\t\t\tvar oldVal = dataModel.get( settingName );\r\n            if(settingName == 'calculations' && 'undefined' != typeof(dataModel.get('calculations'))) {\r\n                var calcModel = dataModel.get( 'calculations' );\r\n                calcModel.each( function( model ) {\r\n                    var oldCalcKey = oldKey.slice( 0, (oldKey.length - 1) ) + ':calc}';\r\n                    var newCalcKey = newKey.slice( 0, (newKey.length - 1 ) ) + ':calc}';\r\n                    oldVal = model.get( 'eq' );\r\n                    if ( 'string' == typeof( oldVal ) ) {\r\n                        var re = new RegExp( oldCalcKey, 'g' );\r\n                        var newVal = oldVal.replace( re, newCalcKey );\r\n                        re = new RegExp( oldKey, 'g' );\r\n                        // TODO: We won't need this second replace when we no longer\r\n                        // have to append :calc to merge tags.\r\n                        newVal = newVal.replace( re, newKey );\r\n                        model.set( 'eq', newVal );\r\n                    }\r\n                } );\r\n                return false;\r\n            }\r\n\t\t\tif ( 'string' == typeof oldVal ) {\r\n\t\t\t\tvar re = new RegExp( oldKey, 'g' );\r\n\t\t\t\tnewVal = oldVal.replace( re, newKey );\r\n\t\t\t\tdataModel.set( settingName, newVal );\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t});\r\n\r\n\treturn controller;\r\n} );\r\n\n","/**\r\n * @package Ninja Forms builder\r\n * @subpackage App\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'models/app/mergeTagLookupCollection',['models/app/mergeTagModel'], function( mergeTagModel ) {\r\n    var collection = Backbone.Collection.extend( {\r\n        model: mergeTagModel\r\n    } );\r\n    return collection;\r\n} );\n","/**\r\n * @package Ninja Forms builder\r\n * @subpackage App\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'views/app/drawer/mergeTag',[], function() {\r\n    var view = Marionette.ItemView.extend({\r\n        tagName: 'li',\r\n        template: '#tmpl-nf-merge-tag-box-tag',\r\n\r\n        events: {\r\n            \"click\": \"insertTag\"\r\n        },\r\n\r\n        insertTag: function() {\r\n            nfRadio.channel( 'mergeTags' ).request( 'insert:tag', this.model.get( 'tag' ) );\r\n        }\r\n    });\r\n\r\n    return view;\r\n} );\n","/**\r\n * @package Ninja Forms builder\r\n * @subpackage App\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'views/app/drawer/mergeTagList',[ 'views/app/drawer/mergeTag' ], function( mergeTagView ) {\r\n    var view = Marionette.CollectionView.extend({\r\n        tagName: 'ul',\r\n        childView: mergeTagView,\r\n\r\n        initialize: function() {\r\n            nfRadio.channel( 'merge-tags' ).reply( 'update:taglist', this.sectionFilter, this );\r\n            nfRadio.channel( 'merge-tags' ).reply( 'filtersearch', this.searchFilter, this );\r\n        },\r\n\r\n        filter: function( child, index, collection ){\r\n            return 'fields' == child.get( 'section' );\r\n        },\r\n\r\n        sectionFilter: function( section ){\r\n            this.filter = function( child, index, collection ){\r\n                return section == child.get( 'section' );\r\n            }\r\n            this.render();\r\n            nfRadio.channel( 'merge-tags' ).trigger( 'after:filtersearch' );\r\n        },\r\n\r\n        searchFilter: function( term ){\r\n            this.filter = function( child, index, collection ){\r\n                var label = child.get( 'label' ).toLowerCase().indexOf( term.toLowerCase().replace( ':', '' ) ) >= 0;\r\n                var tag   = child.get( 'tag' ).toLowerCase().indexOf( term.toLowerCase() ) >= 0;\r\n                return label || tag;\r\n            }\r\n            this.render();\r\n            nfRadio.channel( 'merge-tags' ).trigger( 'after:filtersearch' );\r\n\r\n        }\r\n    });\r\n\r\n    return view;\r\n} );\n","/**\r\n * @package Ninja Forms builder\r\n * @subpackage App\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'views/app/drawer/mergeTagGroup',[], function() {\r\n    var view = Marionette.ItemView.extend({\r\n        tagName: 'li',\r\n        template: '#tmpl-nf-merge-tag-box-section',\r\n        events: {\r\n            \"click\": \"onClick\"\r\n        },\r\n\r\n        initialize: function () {\r\n            this.listenTo( nfRadio.channel( 'merge-tags' ), 'after:filtersearch', this.removeActive );\r\n        },\r\n\r\n        onClick: function(){\r\n          this.updateTags();\r\n          this.setActive();\r\n        },\r\n\r\n        updateTags: function() {\r\n            nfRadio.channel( 'merge-tags' ).request( 'update:taglist', this.model.get( 'id' ) );\r\n        },\r\n\r\n        setActive: function(){\r\n            this.$el.addClass( 'active' );\r\n            this.$el.siblings().removeClass( 'active' );\r\n        },\r\n\r\n        removeActive: function(){\r\n            this.$el.removeClass( 'active' );\r\n        }\r\n    });\r\n\r\n    return view;\r\n} );\n","/**\r\n * @package Ninja Forms builder\r\n * @subpackage App\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'views/app/drawer/mergeTagGroupList',[ 'views/app/drawer/mergeTagGroup' ], function( mergeTagGroupView ) {\r\n    var view = Marionette.CollectionView.extend({\r\n        tagName: 'ul',\r\n        childView: mergeTagGroupView,\r\n\r\n        initialize: function(){\r\n            this.listenTo( nfRadio.channel( 'merge-tags' ), 'open', this.render, this );\r\n        },\r\n\r\n        // TODO: Update filter when a new tag is added. ie Calculations.\r\n        filter: function( child, index, collection ){\r\n            return 0 < child.get( 'tags' ).length;\r\n        },\r\n    });\r\n\r\n    return view;\r\n} );\n","/**\r\n * @package Ninja Forms builder\r\n * @subpackage App\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'views/app/drawer/mergeTagFilter',[], function() {\r\n    var view = Marionette.ItemView.extend({\r\n        template: '#tmpl-nf-merge-tag-box-filter',\r\n        events: {\r\n            \"keyup input\": \"updateFilter\",\r\n        },\r\n        updateFilter: function( event ) {\r\n\r\n            if( /* ENTER */ 13 == event.keyCode ){ // Copied from Keyup Callback.\r\n                // Get top listed merge tag.\r\n                var firstFilteredTag = jQuery( '#merge-tags-box .merge-tag-list ul li span' ).first().data( 'tag' );\r\n\r\n                nfRadio.channel( 'mergeTags' ).request( 'insert:tag', firstFilteredTag );\r\n\r\n                // COPIED FROM BELOW\r\n                jQuery( '#merge-tags-box' ).css( 'display', 'none' );\r\n                jQuery( '#merge-tags-box' ).removeClass();\r\n                jQuery( '.merge-tag-focus' ).removeClass( 'merge-tag-focus' );\r\n                jQuery( '.merge-tag-focus-overlay' ).removeClass( 'merge-tag-focus-overlay' );\r\n                return;\r\n            }\r\n            var value = this.$el.find( 'input' ).val();\r\n            nfRadio.channel( 'merge-tags' ).request( 'filtersearch', value );\r\n        }\r\n    });\r\n\r\n    return view;\r\n} );\n","/**\r\n * @package Ninja Forms builder\r\n * @subpackage App\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'views/app/drawer/mergeTagBox',[], function() {\r\n    var view = Marionette.LayoutView.extend({\r\n        el: '#merge-tags-box',\r\n        template: \"#tmpl-nf-merge-tag-box\",\r\n\r\n        regions: {\r\n            filter:   '.merge-tag-filter',\r\n            sections: '.merge-tag-sections',\r\n            tags:     '.merge-tag-list'\r\n        },\r\n    });\r\n\r\n    return view;\r\n} );\n","/**\r\n * @package Ninja Forms builder\r\n * @subpackage Merge Tag Box\r\n * @copyright (c) 2017 WP Ninjas\r\n * @since 3.1\r\n */\r\n\r\ndefine( 'controllers/app/mergeTagBox',[\r\n    'models/app/mergeTagModel',\r\n    'models/app/mergeTagLookupCollection',\r\n    'views/app/drawer/mergeTag',\r\n    'views/app/drawer/mergeTagList',\r\n    'views/app/drawer/mergeTagGroup',\r\n    'views/app/drawer/mergeTagGroupList',\r\n    'views/app/drawer/mergeTagFilter',\r\n    'views/app/drawer/mergeTagBox'\r\n], function(\r\n    MergeTagModel,\r\n    MergeTagLookupCollection,\r\n    MergeTagView,\r\n    MergeTagListView,\r\n    MergeTagGroupView,\r\n    MergeTagGroupListView,\r\n    MergeTagFilterView,\r\n    MergeTagBoxLayout\r\n) {\r\n    var controller = Marionette.Object.extend( {\r\n\r\n        caret: 0, // Track the caret position of the current setting's input.\r\n        old: '', // THe old merge tag that will be replaced.\r\n\r\n        initialize: function(){\r\n\r\n            this.listenTo( nfRadio.channel( 'drawer' ), 'render:settingGroup', function(){\r\n                jQuery( '.merge-tags' ).off( 'click' );\r\n                jQuery( '.merge-tags' ).on( 'click', this.mergeTagsButtonClick );\r\n            });\r\n\r\n            this.listenTo( nfRadio.channel( 'app' ), 'after:appStart', this.afterAppStart );\r\n            this.listenTo( nfRadio.channel( 'app' ), 'before:renderSetting', this.beforeRenderSetting );\r\n            this.listenTo( nfRadio.channel( 'drawer' ), 'before:close', this.beforeDrawerClose );\r\n\r\n            var that = this;\r\n            nfRadio.channel( 'mergeTags' ).reply( 'set:caret', function( position ){\r\n               that.caret = position;\r\n            });\r\n            nfRadio.channel( 'mergeTags' ).reply( 'get:caret', function(){\r\n                return that.caret;\r\n            });\r\n\r\n            var that = this;\r\n            nfRadio.channel( 'mergeTags' ).reply( 'set:old', function( value ){\r\n                that.old = value;\r\n            });\r\n            nfRadio.channel( 'mergeTags' ).reply( 'get:old', function(){\r\n                return that.old;\r\n            });\r\n\r\n            nfRadio.channel( 'mergeTags' ).reply( 'insert:tag', this.insertTag.bind( this ) );\r\n\r\n            /** OPTION REPEATER */\r\n            this.listenTo( nfRadio.channel( 'option-repeater' ), 'add:option', function( model ){\r\n                var selector = '#' + model.cid + ' .has-merge-tags input.setting';\r\n                jQuery( selector ).on( 'focus', function( event ){\r\n                   that.focusCallback( event, selector, 'option-repeater' );\r\n                });\r\n                jQuery( selector ).on( 'keyup', function( event ){\r\n                    that.keyupCallback( event, selector, 'option-repeater' );\r\n                });\r\n                jQuery( selector ).siblings( '.nf-list-options .merge-tags' ).off( 'click' );\r\n                jQuery( selector ).siblings( '.nf-list-options .merge-tags' ).on( 'click', this.mergeTagsButtonClick );\r\n            } );\r\n            this.listenTo( nfRadio.channel( 'drawer' ), 'opened', function(){\r\n                jQuery( '.nf-list-options .merge-tags' ).off( 'click' );\r\n                jQuery( '.nf-list-options .merge-tags' ).on( 'click', this.mergeTagsButtonClick );\r\n            } );\r\n\r\n            /* CALCULATIONS */\r\n            this.listenTo( nfRadio.channel( 'setting-calculations-option' ), 'render:setting', this.renderSetting );\r\n            // this.listenTo( nfRadio.channel( 'setting-calculations-option' ), 'render:setting', function( settingModel, dataModel, view ){\r\n            //     view.$el.find( '.merge-tags' ).on( 'click', this.mergeTagsButtonClick );\r\n            // } );\r\n            this.listenTo( nfRadio.channel( 'drawer' ), 'opened', function(){\r\n                jQuery( '.nf-list-options.calculations .merge-tags' ).off( 'click' );\r\n                jQuery( '.nf-list-options.calculations .merge-tags' ).on( 'click', this.mergeTagsButtonClick );\r\n            } );\r\n\r\n            /* SUMMERNOTE */\r\n            this.listenTo( nfRadio.channel( 'summernote' ), 'focus', function( e, selector ) {\r\n                that.focusCallback( false, selector, 'rte' );\r\n            } );\r\n            this.listenTo( nfRadio.channel( 'summernote' ), 'keydown', function( e, selector ){\r\n                jQuery( selector ).closest( '.nf-setting' ).find( '.setting' ).summernote( 'saveRange' );\r\n            } );\r\n            this.listenTo( nfRadio.channel( 'summernote' ), 'keyup', function( e, selector ){\r\n                that.keyupCallback( e, selector, 'rte' );\r\n            } );\r\n            this.listenTo( nfRadio.channel( 'drawer' ), 'opened', function(){\r\n                jQuery( '.note-editor .merge-tags' ).off( 'click' );\r\n                jQuery( '.note-editor .merge-tags' ).on( 'click', this.mergeTagsButtonClick );\r\n            } );\r\n\r\n            jQuery( document ).on( 'keyup', function( event ){\r\n                if( 27 == event.keyCode ){\r\n                    nfRadio.channel( 'mergeTags' ).request( 'insert:tag', '' );\r\n                    // Copied from KeyupCallback.\r\n                    jQuery( '#merge-tags-box' ).css( 'display', 'none' );\r\n                    nfRadio.channel( 'drawer' ).request( 'enable:close' );\r\n                    jQuery( '#merge-tags-box' ).removeClass();\r\n                    jQuery( '.merge-tag-focus' ).blur();\r\n                    jQuery( '.merge-tag-focus' ).removeClass( 'merge-tag-focus' );\r\n                    jQuery( '.merge-tag-focus-overlay' ).removeClass( 'merge-tag-focus-overlay' );\r\n                }\r\n            });\r\n\r\n            /**\r\n             * Listen to the Field Changes (add, delete, update) and update the Merge Tags.\r\n             */\r\n            this.listenTo( Backbone.Radio.channel( 'fields' ), 'add:field',    this.afterAppStart );\r\n            this.listenTo( Backbone.Radio.channel( 'fields' ), 'delete:field', this.afterAppStart );\r\n            this.listenTo( Backbone.Radio.channel( 'fieldSetting-key' ), 'update:setting', this.afterAppStart );\r\n\r\n            /** ... and Calc updates. */\r\n            this.listenTo( Backbone.Radio.channel( 'calcs' ), 'update:calc', this.afterAppStart );\r\n\r\n            this.listenTo( Backbone.Radio.channel( 'app' ), 'change:currentDomain', this.afterAppStart );\r\n        },\r\n\r\n        afterAppStart: function() {\r\n\r\n            var currentDomain = Backbone.Radio.channel( 'app' ).request( 'get:currentDomain' );\r\n\r\n            var mergeTagCollection = nfRadio.channel( 'mergeTags' ).request( 'get:collection' );\r\n            var mergeTags = [];\r\n            mergeTagCollection.each( function( section ){\r\n\r\n                section.get( 'tags' ).each( function( tag ){\r\n\r\n                    if( 'fields' == currentDomain.get( 'id' ) && '{submission:sequence}' == tag.get( 'tag' ) ) return;\r\n\r\n                    mergeTags.push({\r\n                        label: tag.get( 'label' ),\r\n                        tag:   tag.get( 'tag' ),\r\n                        section: section.get( 'id' )\r\n                    });\r\n                });\r\n            });\r\n            var layout = new MergeTagBoxLayout();\r\n            layout.render();\r\n            var tagCollection = new MergeTagLookupCollection( mergeTags );\r\n            var mergeTagListView = new MergeTagListView({\r\n                collection: tagCollection\r\n            });\r\n            var mergeTagGroupListView = new MergeTagGroupListView({\r\n                collection: mergeTagCollection\r\n            });\r\n\r\n            layout.getRegion('tags').show(mergeTagListView);\r\n            layout.getRegion('sections').show(mergeTagGroupListView);\r\n            layout.getRegion('filter').show(new MergeTagFilterView);\r\n        },\r\n\r\n        beforeRenderSetting: function( settingModel, dataModel ){\r\n            if( 'undefined' == typeof settingModel.get( 'use_merge_tags' ) ) return;\r\n            if( ! settingModel.get( 'use_merge_tags' ) ) return;\r\n            var name = settingModel.get( 'name' );\r\n            this.listenTo( nfRadio.channel( 'setting-' + name ), 'render:setting', this.renderSetting );\r\n        },\r\n\r\n        renderSetting: function( settingModel, dataModel, view ){\r\n\r\n            view.$el.find( '.merge-tags' ).off( 'click' );\r\n            view.$el.find( '.merge-tags' ).on( 'click', this.mergeTagsButtonClick );\r\n\r\n            if( 0 == jQuery( '#merge-tags-box' ).length ) this.afterAppStart();\r\n\r\n            // Track Scrolling.\r\n            jQuery( '#nf-drawer' ).on( 'scroll', function(){\r\n               // COPIED AND MODIFIED FROM FOCUS\r\n                if( 0 == jQuery( '.merge-tag-focus' ).length ) return;\r\n\r\n                var rteEditor = jQuery( '.merge-tag-focus' ).closest( '.nf-setting' ).find( '.note-editor' );\r\n                if( 0 != rteEditor.length ){\r\n                    var posY = rteEditor.offset().top - jQuery(window).scrollTop();\r\n                    var height = rteEditor.outerHeight();\r\n                } else {\r\n                    var posY = jQuery('.merge-tag-focus').offset().top - jQuery(window).scrollTop();\r\n                    var height = jQuery('.merge-tag-focus').outerHeight();\r\n                }\r\n                jQuery( '#merge-tags-box' ).css( 'top', posY + height );\r\n\r\n                var boxHeight = jQuery( '#merge-tags-box' ).outerHeight();\r\n                jQuery( '#nf-drawer' ).css( 'padding-bottom', boxHeight + 'px' );\r\n\r\n                var repeaterRow = jQuery( '.merge-tag-focus' ).closest( '.nf-list-options-tbody' );\r\n                if( 0 != repeaterRow.length ){\r\n                    var left = repeaterRow.offset().left - jQuery(window).scrollLeft();\r\n                    jQuery( '#merge-tags-box' ).css( 'left', left );\r\n                } else {\r\n                    var posX = jQuery( '.merge-tag-focus' ).closest( '.nf-settings' ).offset().left - jQuery(window).scrollLeft();\r\n                    jQuery( '#merge-tags-box' ).css( 'left', posX );\r\n                    jQuery( '#merge-tags-box' ).css( 'width', jQuery( '.merge-tag-focus' ).closest( '.nf-settings' ).width() );\r\n                }\r\n            });\r\n\r\n            // On input focus, move the Merge Tag Box into position.\r\n            jQuery( view.el ).find( '.setting' ).on( 'focus', this.focusCallback );\r\n\r\n            // TODO: Maybe move to view events.\r\n            // On input keyup, maybe show Merge Tag Box.\r\n            jQuery( view.el ).find( '.setting' ).on( 'keyup', this.keyupCallback );\r\n        },\r\n\r\n        // TODO: Maybe move to view class.\r\n        beforeDrawerClose: function(){\r\n            jQuery( '#merge-tags-box' ).css( 'display', 'none' );\r\n            nfRadio.channel( 'drawer' ).request( 'enable:close' );\r\n            // jQuery( 'body' ).append( jQuery( '#merge-tags-box' ) );\r\n        },\r\n\r\n        insertTag: function( tag ) {\r\n\r\n            var $input = jQuery( '.merge-tag-focus' );\r\n\r\n            if( 0 != $input.closest( '.nf-setting' ).first().find( '.note-editable' ).length ){\r\n                $input = $input.closest( '.nf-setting' ).first().find( '.note-editable' );\r\n            }\r\n\r\n            if( 1 < $input.length ){ $input = $input.first(); }\r\n\r\n            if( $input.hasClass( 'note-editable' ) ){\r\n                var str = $input.closest( '.nf-setting' ).find( '.setting' ).summernote( 'code' );\r\n            } else {\r\n                var str = $input.val();\r\n            }\r\n\r\n            var find = nfRadio.channel( 'mergeTags' ).request( 'get:old' );\r\n            var replace = tag;\r\n            var caretPos = nfRadio.channel( 'mergeTags' ).request( 'get:caret' );\r\n\r\n            var patt = /{([a-zA-Z0-9]|:|_||-})*/g;\r\n\r\n            // Loop through matches to find insert/replace index range.\r\n            // Reference: http://codepen.io/kjohnson/pen/36c3a782644dfff40fe3c1f05f8739d9?editors=0012\r\n            while (match = patt.exec(str)) {\r\n                if (find != match[0]) continue; // This isn't the match you are looking for...\r\n                var string = str.slice(0, match.index) + replace + str.slice(patt.lastIndex); // Fancy replace for the specifc match, using the index/position.\r\n\r\n                if( $input.hasClass( 'note-editable' ) ){\r\n                    $input.closest( '.nf-setting' ).find( '.setting' ).summernote( 'code', string );\r\n\r\n                    // Reposition the caret. http://stackoverflow.com/a/6249440 TODO: Determine the appropriate childNode.\r\n                    var el = $input;\r\n                    var childNode = null; // Default to first childNode.\r\n                    _.each( el[0].childNodes, function( node, index ){\r\n                        if( childNode ) return;\r\n                        if( ! node.nodeValue && ! node.innerHTML ) return;\r\n                        if( node.nodeValue ) {\r\n                            var value = node.nodeValue;\r\n                        } else if( node.innerHTML ){\r\n                            var value = node.innerHTML;\r\n                        }\r\n\r\n                        if( -1 == value.indexOf(replace) ) return; // Replace not found in this node.\r\n\r\n                        value = value.replace( /&nbsp;/g, ' ' );\r\n                        var position = value.indexOf(replace) + find.length;\r\n\r\n                        /*\r\n                         * If no caretPos, determine based on the node. ie Merge Tag Button context.\r\n                         * Note: We can't just check for '{', because they could just be inserting the first tag.\r\n                         */\r\n                        if( -1 == caretPos ){\r\n                            caretPos = value.indexOf( replace ) + 1;\r\n                        }\r\n\r\n                        if (caretPos == position) childNode = el[0].childNodes[index];\r\n                    });\r\n                    if( ! childNode ) childNode = el[0].childNodes[0];\r\n                    var offset = caretPos - find.length + replace.length;\r\n                    var range = document.createRange();\r\n                    var sel = window.getSelection();\r\n                    if( 0 != childNode.childNodes.length ) {\r\n                        try{\r\n                           range.setStart(childNode.childNodes[0], offset); \r\n                        } catch( err ) {\r\n                            console.log( childNode );\r\n                            console.log( 'error' );\r\n                        }\r\n                        \r\n                    } else {\r\n                        try {\r\n                            range.setStart(childNode, offset);\r\n                        } catch( err ) {\r\n                            console.log( 'error' );\r\n                        }\r\n                        \r\n                    }\r\n                    range.collapse(true);\r\n                    sel.removeAllRanges();\r\n                    sel.addRange(range);\r\n\r\n\r\n                } else {\r\n                    $input.val(string); // Update input value with parsed string.\r\n                    $input.change(); // Trigger a change event after inserting the merge tag so that it saves to the model.\r\n                    $input.caret(caretPos - find.length + replace.length); // Update Carept Position.\r\n                }\r\n\r\n            }\r\n\r\n            jQuery( '#merge-tags-box' ).css( 'display', 'none' );\r\n            nfRadio.channel( 'drawer' ).request( 'enable:close' );\r\n            $input.removeClass( 'merge-tag-focus' );\r\n            $input.closest( '.merge-tag-focus-overlay' ).removeClass( 'merge-tag-focus-overlay' );\r\n        },\r\n\r\n        mergeTagsButtonClick: function( e ){\r\n\r\n            var $this = jQuery( this );\r\n\r\n            if( $this.siblings().hasClass( 'merge-tag-focus' ) ){\r\n                nfRadio.channel( 'mergeTags' ).request( 'insert:tag', '' );\r\n                jQuery( '#merge-tags-box' ).css( 'display', 'none' );\r\n                nfRadio.channel( 'drawer' ).request( 'enable:close' );\r\n                jQuery( '.merge-tag-focus' ).removeClass( 'merge-tag-focus' );\r\n                jQuery( '.merge-tag-focus-overlay' ).removeClass( 'merge-tag-focus-overlay' );\r\n                return;\r\n            }\r\n\r\n            if( 0 !== $this.closest( '.nf-setting, .nf-table-row' ).find( '.note-tools' ).length ){\r\n                var $inputSetting = $this.closest( '.note-editor' ).siblings( '.setting' ).first();\r\n                $this.closest( '.nf-setting' ).find( '.setting' ).summernote( 'insertText', '{' );\r\n                // Since we haven't determined the caretPos, set to -1 as a flag to determine later.\r\n                nfRadio.channel('mergeTags').request( 'set:caret', -1 );\r\n            } else {\r\n                var $inputSetting = $this.siblings( '.setting' ).first();\r\n                var text = $inputSetting.val() || '';\r\n                $inputSetting.val( text + '{' ).change();\r\n                nfRadio.channel('mergeTags').request('set:caret', text.length + 1 );\r\n            }\r\n\r\n            if( $this.parent().hasClass( 'note-tools' ) ){\r\n                // $this.closest( '.nf-setting' ).find( '.setting' ).summernote( 'insertText', '{' );\r\n            }\r\n\r\n            nfRadio.channel('mergeTags').request('set:old', '{' );\r\n\r\n            $inputSetting.addClass( 'merge-tag-focus' );\r\n\r\n            // Disable browser autocomplete.\r\n            var autocomplete = $this.attr( 'autocomplete' );\r\n            $this.attr( 'autocomplete', 'off' );\r\n            $this.data( 'autocomplete', autocomplete );\r\n\r\n            var $overlayElement = $this.closest( '.nf-setting, .nf-table-row' );\r\n            if( 0 != $overlayElement.find( '.note-editor' ).length ){\r\n                $overlayElement.find('.note-editor' ).addClass('merge-tag-focus-overlay');\r\n            } else {\r\n                $overlayElement.addClass('merge-tag-focus-overlay');\r\n            }\r\n\r\n            jQuery( '#merge-tags-box' ).css( 'display', 'block' );\r\n            nfRadio.channel( 'drawer' ).request( 'prevent:close' );\r\n\r\n            jQuery( '.merge-tag-focus-overlay' ).off( 'click' );\r\n            jQuery( '.merge-tag-focus-overlay' ).on( 'click', function( e ) {\r\n                if ( jQuery( e.target ).hasClass( 'note-editor' ) ) {\r\n                    nfRadio.channel( 'mergeTags' ).request( 'insert:tag', '' );\r\n                    jQuery( '#merge-tags-box' ).css( 'display', 'none' );\r\n                    nfRadio.channel( 'drawer' ).request( 'enable:close' );\r\n                    jQuery( '#merge-tags-box' ).removeClass();\r\n                    jQuery( '.merge-tag-focus' ).removeClass( 'merge-tag-focus' );\r\n                    jQuery( '.merge-tag-focus-overlay' ).removeClass( 'merge-tag-focus-overlay' );\r\n                }\r\n            } );\r\n\r\n            setTimeout(function(){\r\n                jQuery( '#merge-tags-box' ).find( '.merge-tag-filter' ).find( 'input' ).focus();\r\n            }, 500 );\r\n        },\r\n\r\n        focusCallback: function( e, target, type ){\r\n\r\n            var type = type || 'setting';\r\n            var $this = ( 'undefined' == typeof target ) ? jQuery( this ) : jQuery( target );\r\n\r\n            jQuery( '.merge-tag-focus' ).each(function(index, el){\r\n                if( this == el ) return;\r\n                el.removeClass( 'merge-tag-focus' );\r\n            });\r\n\r\n            if( 'rte' == type ) {\r\n                var posY = $this.closest( '.nf-setting' ).find( '.note-editor' ).offset().top - jQuery(window).scrollTop();\r\n                var height = $this.closest( '.nf-setting' ).find( '.note-editor' ).outerHeight();\r\n            } else {\r\n                var posY = $this.offset().top - jQuery(window).scrollTop();\r\n                var height = $this.outerHeight();\r\n            }\r\n            jQuery( '#merge-tags-box' ).css( 'top', posY + height );\r\n\r\n            var repeaterRow = $this.closest( '.nf-list-options-tbody' );\r\n            if( 0 != repeaterRow.length ) {\r\n                var left = repeaterRow.offset().left - jQuery(window).scrollLeft();\r\n                jQuery( '#merge-tags-box' ).css( 'left', left );\r\n            } else if( 'rte' == type ) {\r\n                var posX = $this.closest( '.nf-setting' ).find( '.note-editor' ).offset().left - jQuery(window).scrollLeft();\r\n                jQuery( '#merge-tags-box' ).css( 'left', posX );\r\n                jQuery( '#merge-tags-box' ).css( 'width', $this.closest( '.nf-setting' ).find( '.note-editor' ).width() );\r\n            }\r\n            else\r\n            {\r\n                var posX = jQuery( this ).closest( '.nf-settings' ).offset().left - jQuery(window).scrollLeft();\r\n                jQuery( '#merge-tags-box' ).css( 'left', posX );\r\n                jQuery( '#merge-tags-box' ).css( 'width', $this.closest( '.nf-settings' ).width() );\r\n            }\r\n\r\n            var dataID = jQuery( this ).data( 'id' );\r\n            if( dataID && 'eq' != dataID ) return;\r\n\r\n            // var offset = jQuery( view.el ).find( '.setting' ).parent().outerHeight();\r\n            // jQuery( view.el ).find( '.setting' ).parent().append( jQuery( '#merge-tags-box' ) );\r\n            // jQuery( '#merge-tags-box' ).css( 'top', offset );\r\n        },\r\n\r\n        keyupCallback: function( event, target, type ){\r\n\r\n            var type = type || 'setting';\r\n\r\n            if( /* ENTER */ 13 == event.keyCode ){\r\n\r\n                // Get top listed merge tag.\r\n                var firstFilteredTag = jQuery( '#merge-tags-box .merge-tag-list ul li span' ).first().data( 'tag' );\r\n\r\n                nfRadio.channel( 'mergeTags' ).request( 'insert:tag', firstFilteredTag );\r\n\r\n                // COPIED FROM BELOW\r\n                jQuery( '#merge-tags-box' ).css( 'display', 'none' );\r\n                nfRadio.channel( 'drawer' ).request( 'enable:close' );\r\n                jQuery( '#merge-tags-box' ).removeClass();\r\n                jQuery( '.merge-tag-focus' ).removeClass( 'merge-tag-focus' );\r\n                jQuery( '.merge-tag-focus-overlay' ).removeClass( 'merge-tag-focus-overlay' );\r\n\r\n                return;\r\n            }\r\n\r\n            // Get the value.\r\n            // var value = jQuery( summernote ).summernote( 'code' );\r\n            // Update the value.\r\n            // jQuery( summernote ).closest( '.nf-setting' ).find( '.note-editable' ).html( value );\r\n\r\n            if( 'undefined' != typeof target ) {\r\n                var $this = jQuery(target);\r\n            } else {\r\n                var $this = jQuery( this );\r\n            }\r\n\r\n            // TODO: Disable Browser Autocomplete\r\n            // $this.attr()\r\n\r\n\r\n            var dataID = jQuery( this ).data( 'id' );\r\n            if( dataID && 'eq' != dataID ) return;\r\n\r\n            // Store the current caret position.\r\n            if( 'rte' == type ){\r\n                var range = $this.summernote('createRange');\r\n                if( range ) {\r\n                    var caretPos = range.so; // or .eo?\r\n                } else {\r\n                    var caretPos = 0;\r\n                }\r\n                $this.closest( '.nf-setting' ).find( '.setting' ).summernote( 'saveRange' );\r\n            } else {\r\n                var caretPos = $this.caret();\r\n            }\r\n            nfRadio.channel( 'mergeTags' ).request( 'set:caret', caretPos );\r\n\r\n            // Find merge tags.\r\n            if( 'rte' == type ) {\r\n                var mergetags = $this.summernote( 'code' ).match(new RegExp(/{([a-zA-Z0-9]|:|_|-|})*/g));\r\n            } else {\r\n                var mergetags = $this.val().match(new RegExp(/{([a-zA-Z0-9]|:|_|-|})*/g));\r\n            }\r\n\r\n            // Filter out closed merge tags.\r\n            mergetags = _.filter(mergetags, function(mergetag) {\r\n                return -1 == mergetag.indexOf( '}' ); // Filter out \"closed\" merge tags.\r\n            });\r\n\r\n            // If an open merge tag is found, show the Merge Tag Box, else hide.\r\n            if( 0 !== mergetags.length ) {\r\n\r\n                nfRadio.channel( 'mergeTags' ).request( 'set:old', mergetags[0] );\r\n\r\n                jQuery('#merge-tags-box').css( 'display', 'block' );\r\n                nfRadio.channel( 'drawer' ).request( 'prevent:close' );\r\n                $this.addClass('merge-tag-focus');\r\n\r\n                var boxHeight = jQuery( '#merge-tags-box' ).outerHeight();\r\n                jQuery( '#nf-drawer' ).css( 'padding-bottom', boxHeight + 'px' );\r\n\r\n                // Disable browser autocomplete.\r\n                var autocomplete = $this.attr( 'autocomplete' );\r\n                $this.attr( 'autocomplete', 'off' );\r\n                $this.data( 'autocomplete', autocomplete );\r\n\r\n                var $overlayElement = $this.closest( '.nf-setting, .nf-table-row' );\r\n                if( 0 != $overlayElement.find( '.note-editor' ).length ){\r\n                    $overlayElement.find('.note-editor' ).addClass('merge-tag-focus-overlay');\r\n                } else {\r\n                    $overlayElement.addClass('merge-tag-focus-overlay');\r\n                }\r\n\r\n                $overlayElement.off( 'click' );\r\n                $overlayElement.on( 'click', function( event ){\r\n                    var elementClasses = jQuery( event.target ).attr( 'class' ) || [];\r\n                    if( -1 !== elementClasses.indexOf( 'merge-tag-focus-overlay' ) ){\r\n                        nfRadio.channel( 'mergeTags' ).request( 'insert:tag', '' );\r\n                        jQuery( '#merge-tags-box' ).css( 'display', 'none' );\r\n                        nfRadio.channel( 'drawer' ).request( 'enable:close' );\r\n                        jQuery( '#merge-tags-box' ).removeClass();\r\n                        jQuery( '.merge-tag-focus' ).removeClass( 'merge-tag-focus' );\r\n                        jQuery( '.merge-tag-focus-overlay' ).removeClass( 'merge-tag-focus-overlay' );\r\n                    }\r\n                });\r\n\r\n                var value = mergetags[0].replace( '{', '' );\r\n                nfRadio.channel( 'merge-tags' ).request( 'filtersearch', value );\r\n            } else {\r\n                jQuery( '#merge-tags-box' ).css( 'display', 'none' );\r\n                nfRadio.channel( 'drawer' ).request( 'enable:close' );\r\n                jQuery( '#merge-tags-box' ).removeClass();\r\n                jQuery( '.merge-tag-focus' ).removeClass( 'merge-tag-focus' );\r\n                jQuery( '.merge-tag-focus-overlay' ).removeClass( 'merge-tag-focus-overlay' );\r\n            }\r\n        }\r\n\r\n    } );\r\n\r\n    return controller;\r\n} );\r\n\n","/**\r\n * Listens to our app channel for settings views being rendered.\r\n *\r\n * If we're about to render a setting model that's a select and has 'fields' as the 'fill' setting, add all our field models to its options.\r\n * \r\n * @package Ninja Forms builder\r\n * @subpackage Main App\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'controllers/app/itemSettingFill',[], function() {\r\n\tvar controller = Marionette.Object.extend( {\r\n\t\tinitialize: function() {\r\n\t\t\t// Listen for messages that are fired before a setting view is rendered.\r\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'before:renderSetting', this.beforeRenderSetting );\r\n\t\t},\r\n\r\n\t\tbeforeRenderSetting: function( settingModel, dataModel ) {\r\n\t\t\tif ( 'fields' == settingModel.get( 'fill' ) ) {\r\n\t\t\t\t\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t});\r\n\r\n\treturn controller;\r\n} );\n","/**\r\n * Modify the user's browser history when they click on a domain\r\n * \r\n * @package Ninja Forms builder\r\n * @subpackage Main App\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'controllers/app/confirmPublish',[], function() {\r\n\tvar controller = Marionette.Object.extend( {\r\n\t\tinitialize: function() {\r\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'click:confirmPublish', this.confirmPublish );\r\n\t\t},\r\n\r\n\t\tconfirmPublish: function() {\r\n\t\t\tvar formModel = nfRadio.channel( 'app' ).request( 'get:formModel' );\r\n\t\t\t// Check to see if we need to add a submit button.\r\n\t\t\tif ( 1 == formModel.get( 'settings' ).get( 'add_submit' ) ) {\r\n\t\t\t\tnfRadio.channel( 'fields' ).request( 'add', { type: 'submit', label: 'Submit', order: 9999 } );\r\n\t\t\t}\r\n\t\t\tformModel.set( 'show_publish_options', false );\r\n\t\t\tnfRadio.channel( 'app' ).request( 'update:db', 'publish' );\r\n\t\t}\r\n\r\n\t});\r\n\r\n\treturn controller;\r\n} );\n","/**\r\n * Handles actions related to settings that utilise the Rich Text Editor\r\n *\r\n * @package Ninja Forms builder\r\n * @subpackage App - Settings Drawer\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'controllers/app/rte',[], function() {\r\n\tvar controller = Marionette.Object.extend( {\r\n\t\tinitialize: function() {\r\n\t\t\t// We don't want the RTE setting to re-render when the value changes.\r\n\t\t\tnfRadio.channel( 'setting-type-rte' ).reply( 'renderOnChange', function(){ return false } );\r\n\r\n\t\t\tthis.listenTo( nfRadio.channel( 'rte' ), 'init:settingModel', this.initSettingModel );\r\n\r\n\t\t\t// When an RTE setting is shown, re-render RTE.\r\n\t\t\tthis.listenTo( nfRadio.channel( 'setting-type-rte' ), 'render:setting', this.renderSetting );\r\n\r\n\t\t\t// When an RTE setting view is destroyed, remove our RTE.\r\n\t\t\tthis.listenTo( nfRadio.channel( 'setting-type-rte' ), 'destroy:setting', this.destroySetting );\r\n\r\n\t\t\t// When an element within the RTE is clicked, check to see if we should insert a link.\r\n\t\t\tthis.listenTo( nfRadio.channel( 'setting-type-rte' ), 'click:extra', this.clickExtra );\r\n\r\n\t\t\t// Instantiates the variable that holds the media library frame.\r\n\t\t\tthis.meta_image_frame;\r\n\r\n\t\t\tjQuery.summernote.options.icons = {\r\n\t\t        'align': 'dashicons dashicons-editor-alignleft',\r\n\t\t        'alignCenter': 'dashicons dashicons-editor-aligncenter',\r\n\t\t        'alignJustify': 'dashicons dashicons-editor-justify',\r\n\t\t        'alignLeft': 'dashicons dashicons-editor-alignleft',\r\n\t\t        'alignRight': 'dashicons dashicons-editor-alignright',\r\n\t\t        'indent': 'dashicons dashicons-editor-indent',\r\n\t\t        'outdent': 'dashicons dashicons-editor-outdent',\r\n\t\t        // 'arrowsAlt': 'dashicons fa-arrows-alt',\r\n\t\t        'bold': 'dashicons dashicons-editor-bold',\r\n\t\t        'caret': 'dashicons dashicons-arrow-down',\r\n\t\t        // 'circle': 'dashicons fa-circle',\r\n\t\t        'close': 'dashicons dashicons-dismiss',\r\n\t\t        'code': 'dashicons dashicons-editor-code',\r\n\t\t        'eraser': 'dashicons dashicons-editor-removeformatting',\r\n\t\t        // 'font': 'dashicons fa-font',\r\n\t\t        // 'frame': 'dashicons fa-frame',\r\n\t\t        'italic': 'dashicons dashicons-editor-italic',\r\n\t\t        'link': 'dashicons dashicons-admin-links',\r\n\t\t        'unlink': 'dashicons dashicons-editor-unlink',\r\n\t\t        'magic': 'dashicons dashicons-editor-paragraph',\r\n\t\t        // 'menuCheck': 'dashicons fa-check',\r\n\t\t        'minus': 'dashicons dashicons-minus',\r\n\t\t        'orderedlist': 'dashicons dashicons-editor-ol',\r\n\t\t        // 'pencil': 'dashicons fa-pencil',\r\n\t\t        // 'picture': 'dashicons fa-picture-o',\r\n\t\t        // 'question': 'dashicons fa-question',\r\n\t\t        'redo': 'dashicons dashicons-redo',\r\n\t\t        'square': 'dashicons fa-square',\r\n\t\t        // 'strikethrough': 'dashicons fa-strikethrough',\r\n\t\t        // 'subscript': 'dashicons fa-subscript',\r\n\t\t        // 'superscript': 'dashicons fa-superscript',\r\n\t\t        'table': 'dashicons dashicons-editor-table',\r\n\t\t        // 'textHeight': 'dashicons fa-text-height',\r\n\t\t        // 'trash': 'dashicons fa-trash',\r\n\t\t        'underline': 'dashicons dashicons-editor-underline',\r\n\t\t        'undo': 'dashicons dashicons-undo',\r\n\t\t        'unorderedlist': 'dashicons dashicons-editor-ul',\r\n\t\t        // 'video': 'dashicons fa-youtube-play'\r\n\t\t      }\r\n\r\n\t\t      this.currentContext = {};\r\n\t\t},\r\n\r\n\t\tinitSettingModel: function( settingModel ) {\r\n\t\t\tsettingModel.set( 'hide_merge_tags', true );\r\n\t\t},\r\n\r\n\t\tinitRTE: function( settingModel, dataModel, settingView ) {\r\n\t\t\t/*\r\n\t\t\t * Custom Button for links\r\n\t\t\t */\r\n\t\t\tvar that = this;\r\n\t\t\t// var linkButton = this.linkButton();\r\n\t\t\tvar linkButton = function( context ) {\r\n\t\t\t\treturn that.linkButton( context );\r\n\t\t\t}\r\n\t\t\tvar mediaButton = function( context ) {\r\n\t\t\t\treturn that.mediaButton( context );\r\n\t\t\t}\r\n\t\t\tvar mergeTags = this.mergeTags();\r\n\r\n\t\t\tvar toolbar = [\r\n\t\t\t\t[ 'paragraphStyle', ['style'] ],\r\n\t\t\t\t[ 'fontStyle', [ 'bold', 'italic', 'underline','clear' ] ],\r\n\t\t\t\t[ 'lists', [ 'ul', 'ol' ] ],\r\n\t\t\t    [ 'paragraph', [ 'paragraph' ] ],\r\n\t\t\t    [ 'customGroup', [ 'linkButton', 'unlink' ] ],\r\n\t\t\t    [ 'table', [ 'table' ] ],\r\n\t\t\t    [ 'actions', [ 'undo', 'redo' ] ],\r\n\t\t\t    [ 'tools', [ 'mediaButton', 'mergeTags', 'codeview' ] ]\r\n\t\t\t];\r\n\r\n\t\t\tjQuery( settingView.el ).find( 'div.setting' ).summernote( {\r\n\t\t\t\ttoolbar: toolbar,\r\n\t\t\t\tbuttons: {\r\n\t\t\t\t\tlinkButton: linkButton,\r\n\t\t\t\t\tmergeTags: mergeTags,\r\n\t\t\t\t\tmediaButton: mediaButton\r\n\t\t\t\t},\r\n\t\t\t\theight: 150,   //set editable area's height\r\n\t\t\t\tcodemirror: { // codemirror options\r\n\t\t\t\t    theme: 'monokai',\r\n\t\t\t\t    lineNumbers: true,\r\n\t\t\t\t    callbacks: {\r\n\t\t\t\t    \tonBlur: function( editor ) {\r\n\t\t\t\t    \t\tvar value = editor.getValue();\r\n\t\t\t\t    \t\tthat.updateDataModel( settingModel, dataModel, value );\r\n\t\t\t\t    \t}\r\n\t\t\t\t    }\r\n\t\t\t\t},\r\n\t\t\t\tprettifyHtml: true,\r\n\t\t\t\tcallbacks: {\r\n\t\t\t\t\tonBlur: function( e, context ) {\r\n\t\t\t\t\t\tvar value = jQuery( this ).summernote( 'code' );\r\n\t\t\t\t\t\tthat.updateDataModel( settingModel, dataModel, value );\r\n                        nfRadio.channel( 'summernote' ).trigger( 'blur', settingModel, dataModel, value );\r\n\t\t\t\t\t},\r\n                    onFocus: function( e, context ) {\r\n                        nfRadio.channel( 'summernote' ).trigger( 'focus', e, this, context );\r\n                    },\r\n                    onKeydown: function( e, context ) {\r\n                        nfRadio.channel( 'summernote' ).trigger( 'keydown', e, this, context );\r\n                    },\r\n                    onKeyup: function( e, context ) {\r\n                        nfRadio.channel( 'summernote' ).trigger( 'keyup', e, this, context );\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t} );\r\n\t\t},\r\n\r\n\t\tupdateDataModel: function( settingModel, dataModel, value ) {\r\n\t\t\tvar name = settingModel.get( 'name' );\r\n\t\t\tvar before = dataModel.get( name );\r\n\t\t\tvar after = value;\r\n\r\n\t\t\tvar changes = {\r\n\t\t\t\tattr: name,\r\n\t\t\t\tbefore: before,\r\n\t\t\t\tafter: after\r\n\t\t\t}\r\n\r\n\t\t\tvar label = {\r\n\t\t\t\tobject: dataModel.get( 'objectType' ),\r\n\t\t\t\tlabel: dataModel.get( 'label' ),\r\n\t\t\t\tchange: 'Changed ' + settingModel.get( 'label' ) + ' from ' + before + ' to ' + after\r\n\t\t\t};\r\n\r\n\t\t\tnfRadio.channel( 'changes' ).request( 'register:change', 'changeSetting', dataModel, changes, label );\r\n\r\n\t\t\tdataModel.set( settingModel.get( 'name' ), after );\r\n\t\t},\r\n\r\n\t\trenderSetting: function( settingModel, dataModel, settingView ) {\r\n\t\t\tthis.initRTE( settingModel, dataModel,settingView );\r\n\t\t\tvar linkMenu = jQuery( settingView.el ).find( '.link-button' ).next( '.dropdown-menu' ).find( 'button' );\r\n\t\t\tlinkMenu.replaceWith(function () {\r\n\t\t\t    return jQuery( '<div/>', {\r\n\t\t\t        class: jQuery( linkMenu ).attr( 'class' ),\r\n\t\t\t        html: this.innerHTML\r\n\t\t\t    } );\r\n\t\t\t} );\r\n\t\t},\r\n\r\n\t\tdestroySetting: function( settingModel, dataModel, settingView ) {\r\n\t\t\tthis.removeRTE( settingModel, dataModel, settingView );\r\n\t\t},\r\n\r\n\t\tremoveRTE: function( settingModel, dataModel, settingView ) {\r\n\t\t\tjQuery( settingView.el ).find( 'div.setting' ).summernote( 'destroy' );\r\n\t\t},\r\n\r\n\t\tdrawerOpened: function( settingModel, dataModel, settingView ) {\r\n\t\t\tthis.initRTE( settingModel, dataModel, settingView );\r\n\t\t},\r\n\r\n\t\tlinkButton: function( context ) {\r\n\t\t\tvar that = this;\r\n\t\t\tvar ui = jQuery.summernote.ui;\r\n\t\t\tvar linkButton = nfRadio.channel( 'app' ).request( 'get:template',  '#tmpl-nf-rte-link-button' );\r\n\t\t\tvar linkDropdown = nfRadio.channel( 'app' ).request( 'get:template',  '#tmpl-nf-rte-link-dropdown' );\r\n\t\t\treturn ui.buttonGroup([\r\n\t\t\t\tui.button({\r\n\t            className: 'dropdown-toggle link-button',\r\n\t            contents: linkButton({}),\r\n\t            tooltip: 'Insert Link',\r\n\t            click: function( e ) {\r\n\t            \tthat.clickLinkButton( e, context );\r\n\t            },\r\n\t            data: {\r\n\t              toggle: 'dropdown'\r\n\t            }\r\n\t          }),\r\n\t\t\t\tui.dropdown([\r\n\t            ui.buttonGroup({\r\n\t              children: [\r\n\t                ui.button({\r\n\t                  contents: linkDropdown({}),\r\n\t                  tooltip: ''\r\n\t                }),\r\n\t              ]\r\n\t            })\r\n\t          ])\r\n\t\t\t]).render();\r\n\t\t},\r\n\r\n\t\tmergeTags: function( context ) {\r\n\t\t\tvar ui = jQuery.summernote.ui;\r\n\t\t\tvar mergeTagsButton = nfRadio.channel( 'app' ).request( 'get:template',  '#tmpl-nf-rte-merge-tags-button' );\r\n\t\t\treturn ui.button({\r\n\t\t\t\tclassName: 'dropdown-toggle merge-tags',\r\n\t\t\t\tcontents: mergeTagsButton({}),\r\n\t\t\t\ttooltip: 'Merge Tags'\r\n\t\t\t}).render();\r\n\t\t},\r\n\r\n\t\tmediaButton: function( context ) {\r\n\t\t\tvar that = this;\r\n\t\t\tvar ui = jQuery.summernote.ui;\r\n\t\t\tvar mediaButton = nfRadio.channel( 'app' ).request( 'get:template',  '#tmpl-nf-rte-media-button' );\r\n\t\t\treturn ui.button({\r\n\t            className: 'dropdown-toggle',\r\n\t            contents: mediaButton({}),\r\n\t            tooltip: 'Insert Media',\r\n\t            click: function( e ) {\r\n\t            \tthat.openMediaManager( e, context );\r\n\t            }\r\n\t          }).render();\r\n\t\t},\r\n\r\n\t\topenMediaManager: function( e, context ) {\r\n\t\t\tcontext.invoke( 'editor.createRange' );\r\n\t\t\tcontext.invoke( 'editor.saveRange' );\r\n\t\t\tthis.currentContext = context;\r\n\t\t\t\r\n\t\t\t// If the frame already exists, re-open it.\r\n\t\t\tif ( this.meta_image_frame ) {\r\n\t\t\t\tthis.meta_image_frame.open();\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\t// Sets up the media library frame\r\n\t\t\tthis.meta_image_frame = wp.media.frames.meta_image_frame = wp.media({\r\n\t\t\t\ttitle: 'Select a file',\r\n\t\t\t\tbutton: { text:  'insert' }\r\n\t\t\t});\r\n\r\n\t\t\tvar that = this;\r\n\r\n\t\t\t// Runs when an image is selected.\r\n\t\t\tthis.meta_image_frame.on('select', function(){\r\n\r\n\t\t\t\t// Grabs the attachment selection and creates a JSON representation of the model.\r\n\t\t\t\tvar media_attachment = that.meta_image_frame.state().get('selection').first().toJSON();\r\n\t\t\t\tthat.insertMedia( media_attachment, context );\r\n\t\t\t});\r\n\r\n\t\t\t// Opens the media library frame.\r\n\t\t\tthis.meta_image_frame.open();\r\n\t\t},\r\n\r\n\t\tclickLinkButton: function ( e, context ) {\r\n\t\t\tvar range = context.invoke( 'editor.createRange' );\r\n\t\t\tcontext.invoke( 'editor.saveRange' );\r\n\t\t\tvar text = range.toString()\r\n\t\t\tthis.currentContext = context;\r\n\r\n\t\t\tjQuery( e.target ).closest( '.note-customGroup > .note-btn-group' ).on ('hide.bs.dropdown', function ( e ) {\r\n\t\t\t\treturn false;\r\n\t\t\t});\r\n\r\n\t\t\tjQuery( e.target ).closest( '.note-customGroup > .note-btn-group' ).on ('shown.bs.dropdown', function ( e ) {\r\n\t\t\t\tjQuery( e.target ).parent().parent().find( '.link-text' ).val( text );\r\n\t\t\t\tjQuery( e.target ).parent().parent().find( '.link-url' ).focus();\r\n\t\t\t});\r\n\t\t},\r\n\r\n\t\tclickExtra: function( e, settingModel, dataModel, settingView ) {\r\n\t\t\tvar textEl = jQuery( e.target ).parent().find( '.link-text' );\r\n\t\t\tvar urlEl = jQuery( e.target ).parent().find( '.link-url' );\r\n\t\t\tvar isNewWindowEl = jQuery( e.target ).parent().find( '.link-new-window' );\r\n\t\t\tthis.currentContext.invoke( 'editor.restoreRange' );\r\n\t\t\tif ( jQuery( e.target ).hasClass( 'insert-link' ) ) {\r\n\t\t\t\tvar text = textEl.val();\r\n\t\t\t\tvar url = urlEl.val();\r\n\t\t\t\tvar isNewWindow = ( isNewWindowEl.prop( 'checked' ) ) ? true: false;\r\n\t\t\t\tif ( 0 != text.length && 0 != url.length ) {\r\n\t\t\t\t\tthis.currentContext.invoke( 'editor.createLink', { text:text, url: url, isNewWindow: isNewWindow } );\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\ttextEl.val( '' );\r\n\t\t\turlEl.val( '' );\r\n\t\t\tisNewWindowEl.prop( 'checked', false );\r\n\t\t\tjQuery( e.target ).closest( 'div.note-btn-group.open' ).removeClass( 'open' );\r\n\t\t},\r\n\r\n\t\tinsertMedia: function( media, context ) {\r\n\t\t\tthis.currentContext.invoke( 'editor.restoreRange' );\r\n\t\t\tif ( 'image' == media.type ) {\r\n\t\t\t\tthis.currentContext.invoke( 'editor.insertImage', media.url );\r\n\t\t\t} else {\r\n\t\t\t\tthis.currentContext.invoke( 'editor.createLink', {\r\n\t\t\t\t\ttext: media.title || media.filename,\r\n\t\t\t\t\turl: media.url\r\n\t\t\t\t} );\r\n\t\t\t}\r\n\r\n\t\t}\r\n\t});\r\n\r\n\treturn controller;\r\n} );\r\n\n","/**\r\n * Listens to our app channel for settings views being rendered.\r\n *\r\n * @package Ninja Forms builder\r\n * @subpackage Main App\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'controllers/app/settingFieldSelect',[], function() {\r\n    var controller = Marionette.Object.extend( {\r\n\r\n        initialize: function() {\r\n\r\n            // Bind field key listener to field-select setting type.\r\n            this.listenTo( nfRadio.channel( 'field-select' ), 'init:settingModel', this.trackKeyChanges );\r\n\r\n            // The first time settingModel and the dataModel meet.\r\n            this.listenTo( nfRadio.channel( 'setting-type-field-select' ), 'before:renderSetting', this.beforeRender );\r\n\r\n            // Add setting change listener only in drawers with a field-select setting.\r\n            this.listenTo( nfRadio.channel( 'field-select' ), 'init:settingModel', function() {\r\n                this.listenTo( nfRadio.channel( 'app' ), 'change:setting', this.maybeSwitchToFieldsDomain );\r\n            });\r\n\r\n            this.listenTo( nfRadio.channel( 'app' ), 'change:currentDomain', this.autoOpenDrawer );\r\n\r\n            this.listenTo( nfRadio.channel( 'drawer' ), 'opened', this.filterDrawerContents );\r\n            this.listenTo( nfRadio.channel( 'drawer' ), 'closed', this.SwitchToFieldsDomain );\r\n        },\r\n\r\n        trackKeyChanges: function( settingModel ) {\r\n            settingModel.listenTo( nfRadio.channel( 'app' ), 'update:fieldKey', settingModel.updateKey );\r\n\r\n            // Update selected field if the selected field's key changes.\r\n            this.listenTo( nfRadio.channel( 'app' ), 'replace:fieldKey', this.updateFieldMap );\r\n        },\r\n\r\n        updateFieldMap: function( dataModel, keyModel, settingModel ) {\r\n\r\n            var oldKey = keyModel._previousAttributes[ 'key' ];\r\n            var newKey = keyModel.get( 'key' );\r\n\r\n            if( 'field-select' == settingModel.get( 'type' ) && dataModel.get( settingModel.get( 'name' ) ) == oldKey ) {\r\n\r\n                dataModel.set( settingModel.get( 'name' ), newKey );\r\n            }\r\n        },\r\n\r\n        beforeRender: function( settingModel, dataModel ) {\r\n\r\n            var fieldCollection = nfRadio.channel( 'fields' ).request( 'get:collection' );\r\n\r\n            var fieldTypes = settingModel.get( 'field_types' );\r\n\r\n            var options = [\r\n                {\r\n                    label: '--',\r\n                    value: 0\r\n                }\r\n            ];\r\n            _.each( fieldCollection.models, function( field ){\r\n\r\n                if( dataModel.cid == field.cid ) return;\r\n\r\n                if( 'undefined' != typeof fieldTypes && 0 != fieldTypes.length && ! _.contains( fieldTypes, field.get( 'type' ) ) ) return;\r\n\r\n                var fieldFilter = settingModel.get( 'field_filter' );\r\n                if( fieldFilter && 'undefined' != typeof fieldFilter[ field.get( 'type' ) ] ) {\r\n                    var bail = false;\r\n                    _.each( fieldFilter[ field.get( 'type' ) ], function( value, setting ){\r\n                        console.log( value + \":\" + field.get( setting )  );\r\n                        if( value != field.get( setting ) ) bail = true;\r\n                    } );\r\n                    if( bail ) return;\r\n                }\r\n\r\n                var value = field.get( 'key' );\r\n                switch ( settingModel.get( 'field_value_format' ) ) {\r\n                    case 'key':\r\n                        value = field.get( 'key' );\r\n                        break;\r\n                    case 'merge_tag':\r\n                    default:\r\n                        value = '{field:' + field.get( 'key' ) + '}';\r\n                }\r\n\r\n                options.push({\r\n                    label: field.get( 'label' ),\r\n                    value: value\r\n                });\r\n            });\r\n\r\n            if( 'undefined' != typeof fieldTypes && 0 != fieldTypes.length ) {\r\n                _.each( fieldTypes, function( fieldType ){\r\n\r\n                    var fieldTypeModel = nfRadio.channel( 'fields' ).request( 'get:type', fieldType );\r\n\r\n                    options.push({\r\n                        label: '-- Add ' + fieldTypeModel.get( 'nicename' ) + ' Field',\r\n                        value: 'addField:' + fieldType,\r\n                    });\r\n                } );\r\n            }\r\n\r\n            settingModel.set( 'options', options );\r\n        },\r\n\r\n        maybeSwitchToFieldsDomain: function( e, model, dataModel ) {\r\n\r\n            if( 'field-select' != model.get( 'type' ) ) return;\r\n\r\n            var name = model.get( 'name' );\r\n            var value = dataModel.get( name );\r\n\r\n            if( ! value ) return;\r\n\r\n            var rubble = value.split( ':' );\r\n\r\n            if( 'addField' != rubble[0] ) return;\r\n\r\n            this.openDrawer = 'addField';\r\n            this.filterDrawer = rubble[1];\r\n\r\n            dataModel.set( name, '' );\r\n\r\n            this.switchDomain = true;\r\n            nfRadio.channel( 'app' ).request( 'close:drawer' );\r\n        },\r\n\r\n        SwitchToFieldsDomain: function() {\r\n            if( this.switchDomain ) {\r\n                var fieldDomainModel = nfRadio.channel( 'app' ).request( 'get:domainModel', 'fields' );\r\n                nfRadio.channel('app').request('change:currentDomain', null, fieldDomainModel);\r\n                this.switchDomain = null;\r\n            }\r\n        },\r\n\r\n        autoOpenDrawer: function() {\r\n            if( this.openDrawer ) {\r\n                nfRadio.channel( 'app' ).request( 'open:drawer', this.openDrawer );\r\n                this.openDrawer = null;\r\n            }\r\n        },\r\n\r\n        filterDrawerContents: function() {\r\n            if( this.filterDrawer ) {\r\n                nfRadio.channel('drawer-addField').trigger('change:filter', this.filterDrawer);\r\n                this.filterDrawer = null;\r\n            }\r\n        }\r\n    });\r\n\r\n    return controller;\r\n} );\n","/**\r\n * The Field List setting is a container of settings (like the Fieldset setting), in which its children are instantiated.\r\n * Unlike the Fieldset setting, Field List settings are dynamically created based on the list of form fields.\r\n *\r\n * Note: Field references in the dynamic setting names are based on field keys, which may change.\r\n * Unlike regular field key tracking, a new setting needs to be created with the same value as the previous.\r\n *\r\n * @package Ninja Forms builder\r\n * @subpackage Action Settings\r\n * @copyright (c) 2016 WP Ninjas\r\n * @author Kyle B. Johnson\r\n * @since 3.0\r\n */\r\ndefine( 'controllers/app/settingFieldList',['views/app/drawer/typeSettingFieldset','models/app/settingCollection'], function( fieldsetView, settingCollection ) {\r\n    return Marionette.Object.extend( {\r\n\r\n        /**\r\n         * A reference list of Field List setting models.\r\n         */\r\n        fieldListSettings: [],\r\n\r\n        initialize: function() {\r\n            this.listenTo( nfRadio.channel( 'field-list' ),       'init:settingModel',    this.registerFieldListSettings  );\r\n            this.listenTo( nfRadio.channel( 'fields' ),           'update:setting',       this.updateFieldListSettingKeys );\r\n                           nfRadio.channel( 'field-list' ).reply( 'get:settingChildView', this.getSettingChildView, this  );\r\n        },\r\n\r\n        /**\r\n         * Build a reference list of Field List setting models for later reference.\r\n         *\r\n         * @param settingModel\r\n         */\r\n        registerFieldListSettings: function( settingModel ){\r\n            this.fieldListSettings.push( settingModel.get( 'name' ) );\r\n        },\r\n\r\n        /**\r\n         * Field List settings contain field keys in the setting names.\r\n         * When a field key changes, so too must the Field List setting name.\r\n         *\r\n         * @param fieldModel\r\n         */\r\n        updateFieldListSettingKeys: function( fieldModel ){\r\n\r\n            // We are only interested in field key changes.\r\n            if( 'undefined' == typeof fieldModel.changed.key ) return;\r\n\r\n            var oldKey = fieldModel._previousAttributes.key;\r\n            var newKey = fieldModel.changed.key;\r\n\r\n            /*\r\n             * This is an absolute (functional) mess of nesting. I apologize to my future self, or Kenny.\r\n             *\r\n             * Each setting of each action model must be checked against each registered Field List setting.\r\n             */\r\n            var that = this;\r\n            _.each( Backbone.Radio.channel( 'actions' ).request( 'get:collection' ).models, function( actionModel ) {\r\n                _.each( actionModel.attributes, function( value, setting ) {\r\n                    var lastChanged = ''; // Used to avoid resetting the change with a duplicate call.\r\n                    _.each( that.fieldListSettings, function( prefix ) {\r\n                        if( setting != prefix + '-' + oldKey || lastChanged == oldKey ) return;\r\n                        var oldValue = actionModel.get( prefix + '-' + oldKey );\r\n                        actionModel.set( prefix + '-' + newKey, oldValue );\r\n                        actionModel.set( prefix + '-' + oldKey, 0 );\r\n                        lastChanged = oldKey;\r\n                    });\r\n                });\r\n            });\r\n        },\r\n\r\n        /**\r\n         * Set the view for Field List sub-settings, just like the Fieldset setting.\r\n         *\r\n         * @param settingModel\r\n         * @returns {*}\r\n         */\r\n        getSettingChildView: function( settingModel ) {\r\n\r\n            /**\r\n             * Dynamically build field-list settings as needed for the view.\r\n             */\r\n\r\n            // Filter fields based on the field_types setting property.\r\n            var fields = _.filter( nfRadio.channel( 'fields' ).request( 'get:collection' ).models, function( field ) {\r\n                return _.contains( settingModel.get( 'field_types' ), field.get( 'type' ) );\r\n            });\r\n\r\n            // Map fields into setting definitions.\r\n            var settings = _.map( fields, function( field ) {\r\n                return {\r\n                    name: settingModel.get( 'name' ) + '-' + field.get( 'key' ),\r\n                    type: 'toggle',\r\n                    label: field.get( 'label' ),\r\n                    width: 'full'\r\n                };\r\n            });\r\n\r\n            settingModel.set( 'settings', new settingCollection( settings ) );\r\n\r\n            // return the child view.\r\n            return fieldsetView;\r\n        },\r\n\r\n    });\r\n} );\r\n\n","/**\r\n * Listens to our app channel for settings views being rendered.\r\n *\r\n *\r\n *\r\n * @package Ninja Forms builder\r\n * @subpackage Main App\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'controllers/app/settingHTML',[], function() {\r\n    var controller = Marionette.Object.extend( {\r\n        initialize: function() {\r\n\r\n            // The first time settingModel and the dataModel meet.\r\n            this.listenTo( nfRadio.channel( 'setting-type-html' ), 'before:renderSetting', this.init );\r\n        },\r\n\r\n        init: function( settingModel, dataModel ) {\r\n\r\n            if( 'undefined' == settingModel.get( 'mirror' ) ) return;\r\n\r\n            // Listen to a setting change inside of the dataModel.\r\n            dataModel.on( 'change:' + settingModel.get( 'mirror' ), this.update, settingModel );\r\n        },\r\n\r\n        update: function( dataModel, changedSettingValue ) {\r\n\r\n            // Mirror the default value setting value.\r\n            dataModel.set( this.get( 'name' ), changedSettingValue );\r\n        }\r\n    });\r\n\r\n    return controller;\r\n} );\n","/**\r\n * Listens to our app channel for settings views being rendered.\r\n *\r\n * @package Ninja Forms builder\r\n * @subpackage Main App\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'controllers/app/settingColor',[], function() {\r\n    var controller = Marionette.Object.extend( {\r\n        initialize: function() {\r\n            // We don't want to re-render this setting type when the data changes.\r\n            nfRadio.channel( 'setting-type-color' ).reply( 'renderOnChange', this.setRenderFalse );\r\n            // We want to close any color pickers before we close our styling tab or drawer.\r\n            this.listenTo( nfRadio.channel( 'setting-type-color' ), 'destroy:setting', this.closeColorPickers );\r\n\r\n            // The first time settingModel and the dataModel meet.\r\n            this.listenTo( nfRadio.channel( 'setting-type-color' ), 'render:setting', this.initColorPicker );\r\n        },\r\n\r\n        initColorPicker: function( settingModel, dataModel, view ) {\r\n\r\n            var name = settingModel.get( 'name' );\r\n            var el = jQuery( view.el ).find( 'input' );\r\n\r\n            jQuery( el ).wpColorPicker( {\r\n                change: function( event, ui ){\r\n                    nfRadio.channel( 'app' ).request( 'change:setting', event, settingModel, dataModel, ui.color.toString() );\r\n                }\r\n            } );\r\n        },\r\n\r\n        setRenderFalse: function() {\r\n            return false;\r\n        },\r\n\r\n        closeColorPickers: function( settingModel, dataModel, view ) {\r\n            jQuery( view.el ).find( '.wp-color-picker' ).wpColorPicker( 'close' );\r\n        }\r\n    });\r\n\r\n    return controller;\r\n} );\n","/**\r\n * Listens to our app channel for the app to start.\r\n *\r\n * If the form is a new form, then highlight the Add New submenu item.\r\n * Otherwise, append an Edit Form submenu for context.\r\n *\r\n * @package Ninja Forms builder\r\n * @subpackage Main App\r\n * @copyright (c) 2016 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'controllers/app/changeMenu',[], function() {\r\n    var controller = Marionette.Object.extend({\r\n\r\n        editFormText: '',\r\n\r\n        initialize: function () {\r\n            this.editFormText = nfAdmin.editFormText || 'Edit Form';\r\n            this.listenTo(nfRadio.channel('app'), 'after:appStart', this.changeMenu);\r\n            this.listenTo( nfRadio.channel( 'app' ), 'response:updateDB', this.formPublish );\r\n        },\r\n\r\n        changeMenu: function () {\r\n            var form = nfRadio.channel( 'app' ).request( 'get:formModel' );\r\n\r\n            if ( this.isNewForm( form.id ) ) {\r\n                this.highlightAddNew();\r\n            } else {\r\n                this.appendEditForm();\r\n            }\r\n        },\r\n\r\n        isNewForm: function( form_id ) {\r\n            return isNaN( form_id );\r\n        },\r\n\r\n        highlightAddNew: function() {\r\n            jQuery( '.wp-submenu li' ).removeClass( 'current' );\r\n            jQuery( 'a[href=\"admin.php?page=ninja-forms&form_id=new\"]' ).parent().addClass( 'current' );\r\n        },\r\n\r\n        appendEditForm: function() {\r\n            var html = '<li class=\"current\"><a href=\"#\">' + this.editFormText + '</a></li>';\r\n            if ( jQuery( 'li a:contains(\"' + this.editFormText + '\")' ).length == 0 ) {\r\n                jQuery( '.wp-submenu li' ).removeClass( 'current' );\r\n                jQuery( 'a[href=\"admin.php?page=ninja-forms&form_id=new\"]' ).parent().after( html );\r\n            }\r\n        },\r\n\r\n        formPublish: function( response ) {\r\n            if ( 'publish' !== response.action ) return false;\r\n            this.changeMenu();\r\n        }\r\n    });\r\n\r\n    return controller;\r\n});\n","/**\r\n * When we click on a domain link, close the mobile menu.\r\n * \r\n * @package Ninja Forms builder\r\n * @subpackage Main App\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'controllers/app/mobile',[], function() {\r\n\tvar controller = Marionette.Object.extend( {\r\n\t\tinitialize: function() {\r\n\t\t\t// Listen for clicks on our app menu.\r\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'click:menu', this.closeMobileMenu );\r\n\t\t},\r\n\r\n\t\tcloseMobileMenu: function() {\r\n\t\t\tvar builderEl = nfRadio.channel( 'app' ).request( 'get:builderEl' );\r\n\t\t\tjQuery( builderEl ).removeClass( 'nf-menu-expand' );\r\n\t\t}\r\n\r\n\t});\r\n\r\n\treturn controller;\r\n} );\n","/**\r\n * Add a jBox notice to the screen.\r\n * \r\n * @package Ninja Forms builder\r\n * @subpackage Main App\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'controllers/app/notices',[], function() {\r\n\tvar controller = Marionette.Object.extend( {\r\n\t\tinitialize: function() {\r\n\t\t\tnfRadio.channel( 'notices' ).reply( 'add', this.addNotice, this );\r\n\t\t\tnfRadio.channel( 'notices' ).reply( 'close', this.closeNotice, this );\r\n\t\t\tthis.notices = {};\r\n\t\t},\r\n\r\n\t\taddNotice: function( key, msg, options ) {\r\n\r\n\t\t\tvar appDefaults = {\r\n\t\t\t\tcontent: msg,\r\n\t\t\t\tcolor: 'green',\r\n\t\t\t\tzIndex:12000,\r\n\t\t\t\tconstructOnInit: true,\r\n\t\t\t\tstack: true,\r\n\t\t\t\tanimation: {\r\n\t\t\t\t\topen: 'flip',\r\n\t\t\t\t\tclose: 'flip'\r\n\t\t\t\t}\r\n\t\t\t};\r\n\r\n\t\t\tvar mobileDefaults = {\r\n\t\t\t\tposition: {\r\n\t\t\t\t\tx: 'center',\r\n\t\t\t\t\ty: 'top'\r\n\t\t\t\t},\r\n\t\t\t\tanimation: {\r\n\t\t\t\t\topen:'slide:top',\r\n\t\t\t\t\tclose:'slide:left'\r\n\t\t\t\t},\r\n\t\t\t\tautoClose: 2000,\r\n\t\t\t\toffset: {\r\n\t\t\t\t\tx: 0,\r\n\t\t\t\t\ty: 55\r\n\t\t\t\t}\r\n\t\t\t};\r\n\r\n\t\t\tvar desktopDefaults = {\r\n\t\t\t\tattributes: {\r\n\t\t\t\t\tx: 'left',\r\n\t\t\t\t\ty: 'bottom'\r\n\t\t\t\t},\r\n\t\t\t\tautoClose: 4000\r\n\t\t\t};\r\n\r\n\t\t\tif ( nfRadio.channel( 'app' ).request( 'is:mobile' ) ) {\r\n\t\t\t\tvar defaults = mobileDefaults;\t\r\n\t\t\t} else {\r\n\t\t\t\tvar defaults = desktopDefaults;\r\n\t\t\t}\r\n\t\t\tdefaults = jQuery.extend( defaults, appDefaults );\r\n\r\n\t\t\tvar options = jQuery.extend( defaults, options );\r\n\t\t\t// console.log( options );\r\n\t\t\tthis.notices[ key ] = new jBox( 'Notice', options );\r\n\t\t},\r\n\r\n\t\tcloseNotice: function( key ) {\r\n\t\t\tif ( 'undefined' != typeof this.notices[ key ] ) {\r\n\t\t\t\tthis.notices[ key ].close();\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\topenNotice: function( key ) {\r\n\t\t\tif ( 'undefined' != typeof this.notices[ key ] ) {\r\n\t\t\t\tthis.notices[ key ].open();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t});\r\n\r\n\treturn controller;\r\n} );\n","/**\r\n * Prompt the user to save if they attempt to leave the page with unsaved changes.\r\n * \r\n * @package Ninja Forms builder\r\n * @subpackage Main App\r\n * @copyright (c) 2016 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'controllers/app/unloadCheck',[], function() {\r\n\tvar controller = Marionette.Object.extend( {\r\n\t\tinitialize: function() {\r\n\t\t\tjQuery( window ).bind( 'beforeunload', this.maybePrompt );\r\n\t\t},\r\n\r\n\t\tmaybePrompt: function( model ) {\r\n\t\t\t// If our app is clean, don't show a warning.\r\n\t\t\tif ( ! nfRadio.channel( 'app' ).request( 'get:setting', 'clean' ) ) {\r\n\t\t\t\treturn 'You have unsaved changes.';\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t});\r\n\r\n\treturn controller;\r\n} );\n","/**\r\n * Before we save data to the database (on preview update or publish), we check to see if we have anyone\r\n * that wants to update the 'formContent' form setting. This setting is used on the front-end to allow\r\n * for custom display of form fields. i.e. layout rows.\r\n * \r\n * @package Ninja Forms builder\r\n * @subpackage Main App\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'controllers/app/formContentFilters',[], function() {\r\n\tvar controller = Marionette.Object.extend( {\r\n\t\tinitialize: function() {\r\n\t\t\t/*\r\n\t\t\t * Init our formContent view filter array.\r\n\t\t\t */\r\n\t\t\tthis.viewFilters = [];\r\n\t\t\tthis.saveFilters = [];\r\n\t\t\tthis.loadFilters = [];\r\n\r\n\t\t\t/*\r\n\t\t     * Listen for requests to add formContent filters.\r\n\t\t\t */\r\n\r\n\t\t\tnfRadio.channel( 'formContent' ).reply( 'add:viewFilter', this.addViewFilter, this );\r\n\t\t\tnfRadio.channel( 'formContent' ).reply( 'add:saveFilter', this.addSaveFilter, this );\r\n\t\t\tnfRadio.channel( 'formContent' ).reply( 'add:loadFilter', this.addLoadFilter, this );\r\n\r\n\t\t\t/*\r\n\t\t\t * Listen for requests to get our formContent filters.\r\n\t\t\t */\r\n\t\t\tnfRadio.channel( 'formContent' ).reply( 'get:viewFilters', this.getViewFilters, this );\r\n\t\t\tnfRadio.channel( 'formContent' ).reply( 'get:saveFilters', this.getSaveFilters, this );\r\n\t\t\tnfRadio.channel( 'formContent' ).reply( 'get:loadFilters', this.getLoadFilters, this );\r\n\t\t\t\r\n\t\t\t/*\r\n\t\t\t * -- DEPRECATED RADIO REPLIES --\r\n\t\t\t * \r\n\t\t\t * The 'fieldContents' channel has been deprecated as of 3.0 (it was present in the RC) in favour of 'formContent'.\r\n\t\t\t * Listen for requests to add new fieldContent filters.\r\n\t\t\t * \r\n\t\t\t * TODO: These radio listeners on the 'fieldContents' channels are here for backwards compatibility and should be removed eventually.\r\n\t\t\t */\r\n\r\n\t\t\tnfRadio.channel( 'fieldContents' ).reply( 'add:viewFilter', this.addViewFilter, this );\r\n\t\t\tnfRadio.channel( 'fieldContents' ).reply( 'add:saveFilter', this.addSaveFilter, this );\r\n\t\t\tnfRadio.channel( 'fieldContents' ).reply( 'add:loadFilter', this.addLoadFilter, this );\r\n\r\n\t\t\t/*\r\n\t\t\t * Listen for requests to get our fieldContent filters.\r\n\t\t\t */\r\n\t\t\tnfRadio.channel( 'fieldContents' ).reply( 'get:viewFilters', this.getViewFilters, this );\r\n\t\t\tnfRadio.channel( 'fieldContents' ).reply( 'get:saveFilters', this.getSaveFilters, this );\r\n\t\t\tnfRadio.channel( 'fieldContents' ).reply( 'get:loadFilters', this.getLoadFilters, this );\r\n\t\t\r\n\t\t\t/*\r\n\t\t\t * -- END DEPRECATED --\r\n\t\t\t */\r\n\t\t},\r\n\r\n\t\taddViewFilter: function( callback, priority ) {\r\n\t\t\tthis.viewFilters[ priority ] = callback;\r\n\t\t},\r\n\r\n\t\tgetViewFilters: function() {\r\n\t\t\treturn this.viewFilters;\r\n\t\t},\r\n\r\n\t\taddSaveFilter: function( callback, priority ) {\r\n\t\t\tthis.saveFilters[ priority ] = callback;\r\n\t\t},\r\n\r\n\t\tgetSaveFilters: function() {\r\n\t\t\treturn this.saveFilters;\r\n\t\t},\r\n\r\n\t\taddLoadFilter: function( callback, priority ) {\r\n\t\t\tthis.loadFilters[ priority ] = callback;\r\n\t\t},\r\n\r\n\t\tgetLoadFilters: function() {\r\n\t\t\treturn this.loadFilters;\r\n\t\t}\r\n\r\n\t});\r\n\r\n\treturn controller;\r\n} );\n","/**\r\n * Handles filters for our main content gutter views.\r\n * \r\n * @package Ninja Forms builder\r\n * @subpackage Main App\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'controllers/app/formContentGutterFilters',[], function() {\r\n\tvar controller = Marionette.Object.extend( {\r\n\t\tinitialize: function() {\r\n\t\t\t/*\r\n\t\t\t * Init our gutter view filter array.\r\n\t\t\t */\r\n\t\t\tthis.leftFilters = [];\r\n\t\t\tthis.rightFilters = [];\r\n\t\t\t/*\r\n\t\t     * Listen for requests to add gutter filters.\r\n\t\t\t */\r\n\t\t\tnfRadio.channel( 'formContentGutters' ).reply( 'add:leftFilter', this.addLeftFilter, this );\r\n\t\t\tnfRadio.channel( 'formContentGutters' ).reply( 'add:rightFilter', this.addRightFilter, this );\r\n\r\n\t\t\t/*\r\n\t\t\t * Listen for requests to get our content gutter filters.\r\n\t\t\t */\r\n\t\t\tnfRadio.channel( 'formContentGutters' ).reply( 'get:leftFilters', this.getLeftFilters, this );\r\n\t\t\tnfRadio.channel( 'formContentGutters' ).reply( 'get:rightFilters', this.getRightFilters, this );\r\n\t\t},\r\n\r\n\t\taddLeftFilter: function( callback, priority ) {\r\n\t\t\tthis.leftFilters[ priority ] = callback;\r\n\t\t},\r\n\r\n\t\taddRightFilter: function( callback, priority ) {\r\n\t\t\tthis.rightFilters[ priority ] = callback;\r\n\t\t},\r\n\r\n\t\tgetLeftFilters: function() {\r\n\t\t\treturn this.leftFilters;\r\n\t\t},\r\n\r\n\t\tgetRightFilters: function() {\r\n\t\t\treturn this.rightFilters;\r\n\t\t}\r\n\r\n\t});\r\n\r\n\treturn controller;\r\n} );\n","/**\r\n * Returns a clone of a backbone collection with all the models' attributes looped through so that collections contained within are propely cloned.\r\n * \r\n * @package Ninja Forms builder\r\n * @subpackage Main App\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'controllers/app/cloneCollectionDeep',[], function() {\r\n\tvar controller = Marionette.Object.extend( {\r\n\t\tinitialize: function() {\r\n\t\t\tnfRadio.channel( 'app' ).reply( 'clone:collectionDeep', this.cloneCollectionDeep, this );\r\n\t\t},\r\n\r\n\t\tcloneCollectionDeep: function( collection ) {\r\n\t\t\tvar models = [];\r\n\t\t\t// Loop through every model in our collection, clone it, and add it to our model array\r\n\t\t\t_.each( collection.models, function( model ) {\r\n\t\t\t\tvar newModel = nfRadio.channel( 'app' ).request( 'clone:modelDeep', model );\r\n\t\t\t\tmodels.push( newModel );\r\n\t\t\t} );\r\n\t\t\t// Create a new instance of our collection\r\n\t\t\treturn new collection.constructor( models, collection.options );\r\n\t\t}\r\n\t});\r\n\r\n\treturn controller;\r\n} );\n","/**\r\n * Tracks which keys have been pressed.\r\n * Currently only used by fields to see if they should duplicate or delete on click.\r\n * (Shift + D + click = delete) (Shift + C + click = duplicate)\r\n * \r\n * @package Ninja Forms builder\r\n * @subpackage Fields - Edit Field Drawer\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'controllers/app/trackKeyDown',[], function() {\r\n\tvar controller = Marionette.Object.extend( {\r\n\t\tkeys: [],\r\n\r\n\t\tinitialize: function() {\r\n\t\t\tvar that = this;\r\n\t\t\t/*\r\n\t\t\t * Track keydowns and store the keys pressed.\r\n\t\t\t */\r\n\t\t\t\r\n\t\t\tjQuery( document ).on( 'keydown', function( e ) {\r\n\t\t\t\tthat.keyDown( e, that );\r\n\t\t\t} );\r\n\r\n\t\t\tjQuery( document ).on( 'keyup', function( e ) {\r\n\t\t\t\tthat.keyUp( e, that );\r\n\t\t\t} );\r\n\r\n\t\t\t/*\r\n\t\t\t * Get the keys currently being pressed, if any\r\n\t\t\t */\r\n\t\t\tnfRadio.channel( 'app' ).reply( 'get:keydown', this.getKeyDown, this );\r\n\t\t},\r\n\r\n\t\tkeyDown: function( e, context ) {\r\n\t\t\t/*\r\n\t\t\t * Add our keycode to our keys array.\r\n\t\t\t */\r\n\t\t\tcontext.keys[ e.keyCode ] = e.keyCode;\r\n\t\t},\r\n\r\n\t\tkeyUp: function( e, context ) {\r\n\t\t\t/*\r\n\t\t\t * Remove our keycode from our keys array.\r\n\t\t\t */\r\n\t\t\tif ( -1 != context.keys.indexOf( e.keyCode ) ) {\r\n\t\t\t\tdelete context.keys[ e.keyCode ];\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\tgetKeyDown: function() {\r\n\t\t\treturn this.keys;\r\n\t\t}\r\n\t});\r\n\r\n\treturn controller;\r\n} );\n","/**\r\n * Initialize the perfectscroll jQuery plugin\r\n * \r\n * @package Ninja Forms builder\r\n * @subpackage Main App\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'controllers/app/perfectScroll',[], function() {\r\n\tvar controller = Marionette.Object.extend( {\r\n\t\tmovedPos: false,\r\n\r\n\t\tinitialize: function() {\r\n\t\t\t/*\r\n\t\t\t * When we init the main view, init our perfectscroll\r\n\t\t\t */\r\n\t\t\tthis.listenTo( nfRadio.channel( 'main' ), 'show:main', this.initPerfectScroll );\r\n\r\n\t\t\t/*\r\n\t\t\t * When our drawer opens and closes, change the position of our scroll rail.\r\n\t\t\t */\r\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer' ), 'opened', this.moveRail );\r\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer' ), 'before:closeDrawer', this.resetRail );\r\n\t\t},\r\n\r\n\t\tinitPerfectScroll: function( view ) {\r\n\t\t\tif ( ! nfRadio.channel( 'app' ).request( 'is:mobile' ) ) {\r\n\t\t\t\tjQuery( view.el ).parent().perfectScrollbar( {\r\n\t\t\t\t\tsuppressScrollX: true\r\n\t\t\t\t} );\r\n\t\t\t}\r\n\r\n\t\t\tjQuery( 'head' ).append( '<style id=\"ps-scrollbar-css\" type=\"text/css\"></style>' );\r\n\t\t},\r\n\r\n\t\tmoveRail: function() {\r\n\t\t\tvar drawerEl = nfRadio.channel( 'app' ).request( 'get:drawerEl' );\r\n\t\t\tvar movedPos = jQuery( drawerEl ).outerWidth();\r\n\r\n\t\t\tjQuery( '#ps-scrollbar-css' ).text( '.ps-scrollbar-moved { right: ' + movedPos + 'px !important; } ' );\r\n\t\t\tjQuery( '#nf-main .ps-scrollbar-y-rail' ).addClass( 'ps-scrollbar-moved ' );\r\n\t\t\t\r\n\t\t},\r\n\r\n\t\tresetRail: function() {\r\n\t\t\tjQuery( '.ps-scrollbar-y-rail' ).removeClass( 'ps-scrollbar-moved ' );\r\n\t\t}\r\n\r\n\t});\r\n\r\n\treturn controller;\r\n} );\n","/**\r\n * Model that represents our type settings groups.\r\n * \r\n * @package Ninja Forms builder\r\n * @subpackage Fields\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'models/app/settingGroupModel',[ 'models/app/settingCollection' ], function( SettingCollection ) {\r\n\tvar model = Backbone.Model.extend( {\r\n\t\tdefaults: {\r\n\t\t\tdisplay: false\r\n\t\t},\r\n\r\n\t\tinitialize: function( options ) {\r\n\t\t\tif ( false == this.get( 'settings' ) instanceof Backbone.Collection ) {\r\n\t\t\t\tthis.set( 'settings', new SettingCollection( this.get( 'settings' ) ) );\r\n\t\t\t}\r\n\t\t}\r\n\t} );\r\n\t\r\n\treturn model;\r\n} );\n","/**\r\n * Collection of our type settings groups.\r\n * \r\n * @package Ninja Forms builder\r\n * @subpackage Fields\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'models/app/settingGroupCollection',['models/app/settingGroupModel'], function( settingGroupModel ) {\r\n\tvar collection = Backbone.Collection.extend( {\r\n\t\tmodel: settingGroupModel\r\n\t} );\r\n\treturn collection;\r\n} );\n","/**\r\n * Returns a new setting group collection.\r\n * Used to settings drawers for custom data models (i.e. not fields, actions, or advanced)\r\n * \r\n * @package Ninja Forms builder\r\n * @subpackage App - Edit Settings Drawer\r\n * @copyright (c) 2016 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'controllers/app/getNewSettingGroupCollection',[ 'models/app/settingGroupCollection' ], function( SettingGroupCollection ) {\r\n\tvar controller = Marionette.Object.extend( {\r\n\t\tinitialize: function() {\r\n\t\t\t// Respond to requests for a new setting group collection\r\n\t\t\tnfRadio.channel( 'app' ).reply( 'get:settingGroupCollectionDefinition', this.getNewSettingGroupCollection, this );\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Return a new instance of the setting group collection.\r\n\t\t *\r\n\t\t * @since  3.0\r\n\t\t * @return backbone.collection\r\n\t\t */\r\n\t\tgetNewSettingGroupCollection: function() {\r\n\t\t\treturn SettingGroupCollection;\r\n\t\t}\r\n\r\n\t});\r\n\r\n\treturn controller;\r\n} );\n","/**\r\n *\r\n * @package Ninja Forms builder\r\n * @subpackage Main App\r\n * @copyright (c) 2017 WP Ninjas\r\n * @since 3.0.30\r\n */\r\ndefine( 'controllers/app/settingMedia',[], function() {\r\n    var controller = Marionette.Object.extend( {\r\n        initialize: function() {\r\n            // When the media button is clicked, open the media manager.\r\n            this.listenTo( nfRadio.channel( 'setting-type-media' ), 'click:extra', this.clickExtra );\r\n        },\r\n\r\n        clickExtra: function( e, settingModel, dataModel, settingView ) {\r\n            var textEl = jQuery( e.target ).parent().find( '.setting' );\r\n\r\n            if ( jQuery( e.target ).hasClass( 'open-media-manager' ) ) {\r\n                // If the frame already exists, re-open it.\r\n                if ( this.meta_image_frame ) {\r\n                    this.meta_image_frame.open();\r\n                    return;\r\n                }\r\n\r\n                // Sets up the media library frame\r\n                this.meta_image_frame = wp.media.frames.meta_image_frame = wp.media({\r\n                    title: 'Select a file',\r\n                    button: { text:  'insert' }\r\n                });\r\n\r\n                var that = this;\r\n\r\n                // Runs when an image is selected.\r\n                this.meta_image_frame.on('select', function(){\r\n                    // Grabs the attachment selection and creates a JSON representation of the model.\r\n                    var media_attachment = that.meta_image_frame.state().get('selection').first().toJSON();\r\n                    textEl.val( media_attachment.url ).change();\r\n                });\r\n\r\n                // Opens the media library frame.\r\n                this.meta_image_frame.open();\r\n            }\r\n        },\r\n    });\r\n\r\n    return controller;\r\n} );\n","/**\r\n * Model for our field type\r\n * \r\n * @package Ninja Forms builder\r\n * @subpackage Fields\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'models/app/typeModel',[ 'models/app/settingGroupCollection' ], function( SettingGroupCollection ) {\r\n\tvar model = Backbone.Model.extend( {\r\n\t\tinitialize: function() {\r\n\t\t\tif ( false === this.get( 'settingGroups' ) instanceof Backbone.Collection ) {\r\n\t\t\t\tthis.set( 'settingGroups', new SettingGroupCollection( this.get( 'settingGroups' ) ) );\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tnfRadio.channel( 'fields' ).trigger( 'init:typeModel', this );\r\n\t\t}\r\n\t} );\r\n\t\r\n\treturn model;\r\n} );\n","/**\r\n * Collection that holds our field type models. \r\n * \r\n * @package Ninja Forms builder\r\n * @subpackage Fields\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'models/app/typeCollection',['models/app/typeModel'], function( typeModel ) {\r\n\tvar collection = Backbone.Collection.extend( {\r\n\t\tmodel: typeModel,\r\n\t\ttype: false,\r\n\r\n\t\tinitialize: function( models, options ) {\r\n\t\t\t_.each( options, function( option, key ) {\r\n\t\t\t\tthis[ key ] = option;\r\n\t\t\t}, this );\r\n\t\t}\r\n\t} );\r\n\treturn collection;\r\n} );\n","/**\r\n * Model that represents our field type section on the add new field drawer.\r\n * \r\n * @package Ninja Forms builder\r\n * @subpackage Fields\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'models/fields/typeSectionModel',[], function() {\r\n\tvar model = Backbone.Model.extend( {\r\n\t\tdefaults: {\r\n\t\t\tclasses: ''\r\n\t\t}\r\n\t} );\r\n\t\r\n\treturn model;\r\n} );\n","/**\r\n * Collection that holds our field models.\r\n * \r\n * @package Ninja Forms builder\r\n * @subpackage Fields\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'models/fields/typeSectionCollection',['models/fields/typeSectionModel'], function( typeSectionModel ) {\r\n\tvar collection = Backbone.Collection.extend( {\r\n\t\tmodel: typeSectionModel\r\n\t} );\r\n\treturn collection;\r\n} );\n","/**\r\n * Creates and stores a collection of field types. This includes all of the settings shown when editing a field.\r\n *\r\n * 1) Create our settings sections config\r\n * 2) Loops over our preloaded data and adds that to our field type collection\r\n *\r\n * Also responds to requests for data about field types\r\n *\r\n * @package Ninja Forms builder\r\n * @subpackage Fields\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'controllers/fields/types',[\r\n\t\t'models/app/typeCollection',\r\n\t\t'models/fields/typeSectionCollection'\r\n\t],\r\n\tfunction(\r\n\t\tTypeCollection,\r\n\t\tSectionCollection\r\n\t) {\r\n\tvar controller = Marionette.Object.extend( {\r\n\t\tinitialize: function() {\r\n\t\t\t// Config for our settings sections\r\n\t\t\tthis.sections = new SectionCollection( fieldTypeSections );\r\n\t\t\tthis.listenTo( nfRadio.channel( 'fields' ), 'init:typeModel', this.registerSection );\r\n\r\n\t\t\t// Create our field type collection\r\n\t\t\tthis.collection = new TypeCollection( fieldTypeData, { type: 'fields' } );\r\n\r\n\t\t\t// Respond to requests to get field type, collection, settings, and sections\r\n\t\t\tnfRadio.channel( 'fields' ).reply( 'get:type', this.getFieldType, this );\r\n\t\t\tnfRadio.channel( 'fields' ).reply( 'get:typeCollection', this.getTypeCollection, this );\r\n\t\t\tnfRadio.channel( 'fields' ).reply( 'get:typeSections', this.getTypeSections, this );\r\n\t\t\tnfRadio.channel( 'fields' ).reply( 'get:savedFields', this.getSavedFields, this );\r\n\r\n\t\t\t// Listen to clicks on field types\r\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer' ), 'click:fieldType', this.addField );\r\n\t\t},\r\n\r\n\t\tregisterSection: function( typeModel ) {\r\n\t\t\tif ( 'fields' != typeModel.collection.type || ! typeModel.get( 'section' ) ) return;\r\n\r\n\t\t\tthis.sections.get( typeModel.get( 'section' ) ).get( 'fieldTypes' ).push( typeModel.get( 'id' ) );\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Return a field type by id\r\n\t\t *\r\n\t\t * @since  3.0\r\n\t\t * @param  string \t\t\tid \tfield type\r\n\t\t * @return backbone.model    \tfield type model\r\n\t\t */\r\n\t\tgetFieldType: function( id ) {\r\n        \treturn this.collection.get( id );\r\n        },\r\n\r\n        /**\r\n         * Return the entire field type collection\r\n         *\r\n         * @since  3.0\r\n         * @param  string \t\t\t\tid \t[description]\r\n         * @return backbone.collection    \tfield type collection\r\n         */\r\n\t\tgetTypeCollection: function( id ) {\r\n        \treturn this.collection;\r\n        },\r\n\r\n        /**\r\n         * Add a field type to our fields sortable when the field type button is clicked.\r\n         *\r\n         * @since 3.0\r\n         * @param Object e event\r\n         * @return void\r\n         */\r\n        addField: function( e ) {\r\n\t\t\tvar type = jQuery( e.target ).data( 'id' );\r\n\r\n\t\t\tif( e.shiftKey ){\r\n\t\t\t\tnfRadio.channel( 'fields' ).request( 'add:stagedField', type );\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n        \tvar fieldModel = nfRadio.channel( 'fields' ).request( 'add', {\r\n\t\t\t\ttype: type,\r\n\r\n\t\t\t\tlabel: nfRadio.channel( 'fields' ).request( 'get:type', type ).get( 'nicename' )\r\n\t\t\t});\r\n\r\n\t\t\tconsole.log( fieldModel );\r\n\r\n\t\t\tvar label = {\r\n\t\t\t\tobject: 'Field',\r\n\t\t\t\tlabel: fieldModel.get( 'label' ),\r\n\t\t\t\tchange: 'Added',\r\n\t\t\t\tdashicon: 'plus-alt'\r\n\t\t\t};\r\n\r\n\t\t\tvar data = {\r\n\t\t\t\tcollection: nfRadio.channel( 'fields' ).request( 'get:collection' )\r\n\t\t\t}\r\n\r\n\t\t\tnfRadio.channel( 'changes' ).request( 'register:change', 'addObject', fieldModel, null, label, data );\r\n\r\n\t\t\t// Re-Draw the Field Collection\r\n\t\t\tnfRadio.channel( 'fields' ).request( 'redraw:collection' );\r\n        },\r\n\r\n        /**\r\n         * Return our field type settings sections\r\n         *\r\n         * @since  3.0\r\n         * @return backbone.collection field type settings sections\r\n         */\r\n        getTypeSections: function() {\r\n            return this.sections;\r\n        },\r\n\r\n        /**\r\n         * Return our saved fields\r\n         *\r\n         * @since  3.0\r\n         * @return backbone.collection\r\n         */\r\n        getSavedFields: function() {\r\n        \tthis.sections.get( 'saved' );\r\n        }\r\n\t});\r\n\r\n\treturn controller;\r\n} );\r\n\n","/**\r\n * Handles the logic for our field type draggables.\r\n * \r\n * @package Ninja Forms builder\r\n * @subpackage Fields - New Field Drawer\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'controllers/fields/fieldTypeDrag',[], function( ) {\r\n\tvar controller = Marionette.Object.extend( {\r\n\t\tinitialize: function() {\r\n\t\t\t// Listen to our field type draggables and run the appropriate function.\r\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer-addField' ), 'startDrag:type', this.startDrag );\r\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer-addField' ), 'stopDrag:type', this.stopDrag );\r\n\t\t\t/*\r\n\t\t\t * Respond to requests for our helper clone.\r\n\t\t\t * This is used by other parts of the application to modify what the user is dragging in real-time.\r\n\t\t\t */ \r\n\t\t\tnfRadio.channel( 'drawer-addField' ).reply( 'get:typeHelperClone', this.getCurrentDraggableHelperClone, this );\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * When we start dragging:\r\n\t\t * get our drawer element\r\n\t\t * set its overflow property to visible !important -> forces the type drag element to be on at the top of the z-index.\r\n\t\t * get our main element\r\n\t\t * est its overflow propery to visible !important -> forces the type drag element to be on top of the z-index.\r\n\t\t * set our dragging helper clone\r\n\t\t * \r\n\t\t * @since  3.0\r\n\t\t * @param  object context \tThis function is going to be called from a draggable. Context is the \"this\" reference to the draggable.\r\n\t\t * @param  object ui      \tObject sent by jQuery UI draggable.\r\n\t\t * @return void\r\n\t\t */\r\n\t\tstartDrag: function( context, ui ) {\r\n\t\t\tthis.drawerEl = nfRadio.channel( 'app' ).request( 'get:drawerEl' );\r\n\t\t\tthis.mainEl = nfRadio.channel( 'app' ).request( 'get:mainEl' );\r\n\t\t\tjQuery( this.drawerEl )[0].style.setProperty( 'overflow', 'visible', 'important' );\r\n\r\n\t\t\tthis.draggableHelperClone = jQuery( ui.helper ).clone();\r\n\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * When we stop dragging, reset our overflow property to hidden !important.\r\n\t\t * \r\n\t\t * @since  3.0\r\n\t\t * @param  object context \tThis function is going to be called from a draggable. Context is the \"this\" reference to the draggable.\r\n\t\t * @param  object ui      \tObject sent by jQuery UI draggable.\r\n\t\t * @return {[type]}         [description]\r\n\t\t */\r\n\t\tstopDrag: function( context, ui ) {\r\n\t\t\tjQuery( this.drawerEl )[0].style.setProperty( 'overflow', 'hidden', 'important' );\r\n\t\t},\r\n\r\n\t\tgetCurrentDraggableHelperClone: function() {\r\n\t\t\treturn this.draggableHelperClone;\r\n\t\t}\r\n\t});\r\n\r\n\treturn controller;\r\n} );\n","/**\r\n * Handles the dragging of our field staging area\r\n * \r\n * @package Ninja Forms builder\r\n * @subpackage Fields - New Field Drawer\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'controllers/fields/stagingDrag',[], function( ) {\r\n\tvar controller = Marionette.Object.extend( {\r\n\t\tinitialize: function() {\r\n\t\t\t// Listen for the start and stop of our field staging dragging\r\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer-addField' ), 'startDrag:fieldStaging', this.startDrag );\r\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer-addField' ), 'stopDrag:fieldStaging', this.stopDrag );\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * When the user starts dragging the staging area, we have to:\r\n\t\t * set the overflow property of the drawer to visible !important. If we don't, the button goes underneath the main section.\r\n\t\t * set the overflow proerty of the main to visible !important. If we don't, the dragged element goes underneath the drawer.\r\n\t\t * replace our helper with the stacked \"x fields\" template.\r\n\t\t * \r\n\t\t * @since  3.0\r\n\t\t * @param  Object\t context jQuery UI Draggable\r\n\t\t * @param  Object\t ui      jQuery UI element\r\n\t\t * @return void\r\n\t\t */\r\n\t\tstartDrag: function( context, ui ) {\r\n\t\t\tthis.drawerEl = nfRadio.channel( 'app' ).request( 'get:drawerEl' );\r\n\t\t\tthis.mainEl = nfRadio.channel( 'app' ).request( 'get:mainEl' );\r\n\t\t\tjQuery( this.drawerEl )[0].style.setProperty( 'overflow', 'visible', 'important' );\r\n\t\t\t// jQuery( this.mainEl )[0].style.setProperty( 'overflow', 'visible', 'important' );\r\n\r\n\t\t\tvar stagedFields = nfRadio.channel( 'fields' ).request( 'get:staging' );\r\n\t\t\tvar html = nfRadio.channel( 'app' ).request( 'get:template',  '#tmpl-nf-staged-fields-drag' );\r\n\t\t\tjQuery( ui.helper ).html( html( { num: stagedFields.models.length } ) );\r\n\t\t\tjQuery( ui.helper ).prop( 'id', 'nf-staged-fields-drag' );\r\n\t\t\tjQuery( ui.item ).css( 'opacity', '0.7' );\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * When we stop dragging the staging area, we have to set the overflow property to hidden !important\r\n\t\t * \r\n\t\t * @since  3.0\r\n\t\t * @param  Object\t context jQuery UI Draggable\r\n\t\t * @param  Object\t ui      jQuery UI element\r\n\t\t * @return void\r\n\t\t */\r\n\t\tstopDrag: function( context, ui ) {\r\n\t\t\tjQuery( this.drawerEl )[0].style.setProperty( 'overflow', 'hidden', 'important' );\r\n\t\t\t// jQuery( this.mainEl )[0].style.setProperty( 'overflow', 'hidden', 'important' );\r\n\t\t}\r\n\t});\r\n\r\n\treturn controller;\r\n} );\n","/**\r\n * Handles most things related to our staging area:\r\n * 1) Creates a collection\r\n * 2) Listens for requests to CRUD items from the collection\r\n * 3) Adds our staged fields to the fields sortable when the drawer is closed\r\n * \r\n * @package Ninja Forms builder\r\n * @subpackage Fields - New Field Drawer\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'controllers/fields/staging',['models/fields/stagingCollection'], function( stagingCollection ) {\r\n\tvar controller = Marionette.Object.extend( {\r\n\t\tinitialize: function() {\r\n\t\t\t// Create our staged fields collection\r\n\t\t\tthis.collection = new stagingCollection();\r\n\t\t\t// Respond to requests related to our staging area.\r\n\t\t    nfRadio.channel( 'fields' ).reply( 'add:stagedField', this.addStagedField, this );\r\n\t\t\tnfRadio.channel( 'fields' ).reply( 'remove:stagedField', this.removeStagedField, this );\r\n\t\t\tnfRadio.channel( 'fields' ).reply( 'get:staging', this.getStagingCollection, this );\r\n\t\t\tnfRadio.channel( 'fields' ).reply( 'sort:staging', this.sortStagedFields, this );\r\n\t\t\tnfRadio.channel( 'fields' ).reply( 'clear:staging', this.clearStagedFields, this );\r\n\t\t\t// Listen to our remove staged field click event.\r\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer-addField' ), 'click:removeStagedField', this.removeStagedField );\r\n\t\t\t// Listen to our event that fires just before a drawer is closed.\r\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer-addField' ), 'before:closeDrawer', this.beforeCloseDrawer );\r\n\t\t},\r\n\r\n\t\tgetStagingCollection: function() {\r\n\t\t\treturn this.collection;\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Add a field to our staging area\r\n\t\t * \r\n\t\t * @since 3.0\r\n\t\t * @param string type Type of field we're adding\r\n\t\t * @return tmpID\r\n\t\t */\r\n\t\taddStagedField: function( type, silent ) {\r\n\t\t\tvar silent = silent || false;\r\n\t\t\t// Get our type model from the string.\r\n\t\t\tvar fieldType = nfRadio.channel( 'fields' ).request( 'get:type', type );\r\n\t\t\t// Our tmp ID is a string with the time appended to make it unique.\r\n\t\t\tvar tmpID = 'nf-staged-field-' + jQuery.now();\r\n\t\t\t// Object that will be added to our staging collection.\r\n\t\t\tvar data = {\r\n\t\t\t\tid: tmpID,\r\n\t\t\t\t// i.e. firstname, textbox, etc.\r\n\t\t\t\tslug: fieldType.get( 'type' ),\r\n\t\t\t\t// i.e. First Name, Textbox, etc.\r\n\t\t\t\tnicename: fieldType.get( 'nicename' ),\r\n\t\t\t\t// i.e. calendar, envelope, etc.\r\n\t\t\t\ticon: fieldType.get( 'icon' )\r\n\t\t\t}\r\n\t\t\t// \r\n\t\t\tvar model = this.collection.add( data );\r\n\r\n\t\t\tif( ! silent ) nfRadio.channel( 'fields').trigger( 'add:stagedField', model );\r\n\r\n\t\t\treturn tmpID;\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Remove a field from staging\r\n\t\t * \r\n\t\t * @since  3.0\r\n\t\t * @param  Object \t\t\te     \tEvent\r\n\t\t * @param  Backbone.model \tmodel \tstaged field model to remove\r\n\t\t * @return void\r\n\t\t */\r\n\t\tremoveStagedField: function( e, model ) {\r\n\t\t\tthis.collection.remove( model );\r\n\t\t\tnfRadio.channel( 'fields' ).trigger( 'remove:stagedField', model );\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Adds our staged fields to the main fields sortable before the drawer is closed.\r\n\t\t * \r\n\t\t * @since  3.0\r\n\t\t * @return void\r\n\t\t */\r\n\t\tbeforeCloseDrawer: function() {\r\n\t\t\tif ( 0 != this.collection.models.length ) { // Make sure that we have models\r\n\t\t\t\t// Get our field collection.\r\n\t\t\t\tvar fieldCollection = nfRadio.channel( 'fields' ).request( 'get:collection' );\r\n\r\n\t\t\t\tvar fields = [];\r\n\t\t\t\t// Loop through our staging collection\r\n\t\t\t\t_.each( this.collection.models, function( model ) {\r\n\t\t\t\t\t// Get a tmp ID for our new field.\r\n\t\t\t\t\tvar tmpID = nfRadio.channel( 'fields' ).request( 'get:tmpID' );\r\n\t\t\t\t\t// Create an object that can be added as a model.\r\n\t\t\t\t\tvar tmpField = { id: tmpID, label: model.get( 'nicename' ), type: model.get( 'slug' ) };\r\n\t\t\t\t\t// Add our new field.\r\n\t\t\t\t\tvar newModel = nfRadio.channel( 'fields' ).request( 'add',  tmpField, false );\r\n\t\t\t\t\t// Add our field addition to our change log.\r\n\t\t\t\t\tvar label = {\r\n\t\t\t\t\t\tobject: 'Field',\r\n\t\t\t\t\t\tlabel: newModel.get( 'label' ),\r\n\t\t\t\t\t\tchange: 'Added',\r\n\t\t\t\t\t\tdashicon: 'plus-alt'\r\n\t\t\t\t\t};\r\n\t\t\t\t\tvar data = {\r\n\t\t\t\t\t\tcollection: fieldCollection\r\n\t\t\t\t\t}\r\n\t\t\t\t\tnfRadio.channel( 'changes' ).request( 'register:change', 'addObject', newModel, null, label, data );\r\n\t\t\t\r\n\t\t\t\t} );\r\n\t\t\t\t// Trigger a reset on our field collection so that our view re-renders\r\n\t\t\t\tfieldCollection.trigger( 'reset', fieldCollection );\r\n\t\t\t\t// Empty the staging collection\r\n\t\t\t\tthis.collection.reset();\r\n\t\t\t}\r\n\t\t\t// Sort our fields.\r\n\t\t\tnfRadio.channel( 'fields' ).request( 'sort:fields', null, null, false );\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Sort our staging area by the 'order' attribute.\r\n\t\t * \r\n\t\t * @since  3.0\r\n\t\t * @return void\r\n\t\t */\r\n\t\tsortStagedFields: function() {\r\n\t\t\t// Get our staged fields sortable.\r\n\t\t\tvar sortableEl = nfRadio.channel( 'app' ).request( 'get:stagedFieldsEl' );\r\n\t\t\t// Get the current order using jQuery sortable. Will be an array of IDs: [tmp-blah, tmp-blah]\r\n\t\t\tvar order = jQuery( sortableEl ).sortable( 'toArray' );\r\n\t\t\t// Loop through our models\r\n\t\t\t_.each( this.collection.models, function( field ) {\r\n\t\t\t\t// Search our order array for this field.\r\n\t\t\t\tvar search = field.get( 'id' );\r\n\t\t\t\tvar pos = order.indexOf( search );\r\n\t\t\t\t// Update our staged field model with the new order.\r\n\t\t\t\tfield.set( 'order', pos );\r\n\t\t\t} );\r\n\t\t\t// Sort our staging collection.\r\n\t\t\tthis.collection.sort();\r\n\t\t},\r\n\r\n\t\tclearStagedFields: function() {\r\n\t\t\tthis.collection.reset();\r\n\t\t}\r\n\r\n\t});\r\n\r\n\treturn controller;\r\n} );\n","/**\r\n * Handles actions related to our staged fields sortable.\r\n * \r\n * @package Ninja Forms builder\r\n * @subpackage Fields - New Field Drawer\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'controllers/fields/stagingSortable',['models/fields/stagingCollection'], function( stagingCollection ) {\r\n\tvar controller = Marionette.Object.extend( {\r\n\t\tinitialize: function() {\r\n\t\t\t// Listen to our field type draggables\r\n\t\t\t// this.listenTo( nfRadio.channel( 'drawer-addField' ), 'startDrag:type', this.addActiveClass );\r\n\t\t\t// this.listenTo( nfRadio.channel( 'drawer-addField' ), 'stopDrag:type', this.removeActiveClass );\r\n\t\t\t// Listen to our sortable events\r\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer-addField' ), 'receive:stagedFields', this.receiveStagedFields );\r\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer-addField' ), 'over:stagedFields', this.overStagedFields );\r\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer-addField' ), 'out:stagedFields', this.outStagedFields );\r\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer-addField' ), 'start:stagedFields', this.startStagedFields );\r\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer-addField' ), 'stop:stagedFields', this.stopStagedFields );\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Change our dropped field type helper so that it matches the other items in our sortable.\r\n\t\t * \r\n\t\t * @since  3.0\r\n\t\t * @param  Object \tui jQuery UI item\r\n\t\t * @return void\r\n\t\t */\r\n\t\treceiveStagedFields: function( ui ) {\r\n\t\t\tif( jQuery( ui.item ).hasClass( 'nf-field-type-draggable' ) ) {\r\n\t\t\t\tvar type = jQuery( ui.item ).data( 'id' );\r\n\t\t\t\tvar tmpID = nfRadio.channel( 'fields' ).request( 'add:stagedField', type );\r\n\t\t\t\tjQuery( ui.helper ).prop( 'id', tmpID );\r\n\t\t\t\tnfRadio.channel( 'fields' ).request( 'sort:staging' );\r\n\t\t\t\tjQuery( ui.helper ).remove();\r\n\t\t\t\tnfRadio.channel( 'drawer-addField' ).trigger( 'drop:fieldType', type );\t\t\t\t\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Add an active class to our sortable when a field type item is dragged\r\n\t\t * \r\n\t\t * @since 3.0\r\n\t\t */\r\n\t\taddActiveClass: function() {\r\n\t\t\tvar stagedFieldsEl = nfRadio.channel( 'app' ).request( 'get:stagedFieldsEl' );\r\n\t\t\tjQuery( stagedFieldsEl ).addClass( 'nf-droppable-active' );\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Remove the active class from our sortable when the field type item is dropped.\r\n\t\t * \r\n\t\t * @since  3.0\r\n\t\t * @return void\r\n\t\t */\r\n\t\tremoveActiveClass: function() {\r\n\t\t\tvar stagedFieldsEl = nfRadio.channel( 'app' ).request( 'get:stagedFieldsEl' );\r\n\t\t\tjQuery( stagedFieldsEl ).removeClass( 'nf-droppable-active' );\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * When the field type item is dragged over our sortable, we change the helper to match the sortable items.\r\n\t\t * \r\n\t\t * @since  3.0\r\n\t\t * @param  Object \te  event\r\n\t\t * @param  Object \tui jQuery UI Element\r\n\t\t * @return void\r\n\t\t */\r\n\t\toverStagedFields: function( e, ui ) {\r\n\t\t\tif( jQuery( ui.item ).hasClass( 'nf-field-type-draggable' ) ) {\r\n\t\t\t\tvar type = jQuery( ui.item ).data( 'id' );\r\n\t\t\t\tvar fieldType = nfRadio.channel( 'fields' ).request( 'get:type', type );\r\n\t\t\t\tvar nicename = fieldType.get( 'nicename' );\r\n\t\t\t\tthis.currentHelper = ui.helper \r\n\t\t\t\tjQuery( ui.helper ).html( nicename + '<span class=\"dashicons dashicons-dismiss\"></span>' );\r\n\t\t\t\tjQuery( ui.helper ).removeClass( 'nf-field-type-button' ).addClass( 'nf-item-dock' ).css( { 'opacity': '0.8', 'width': '', 'height': '' } );\r\n\t\t\t\tvar sortableEl = nfRadio.channel( 'app' ).request( 'get:stagedFieldsEl' );\r\n\t\t\t\tif ( jQuery( sortableEl ).hasClass( 'ui-sortable' ) ) {\r\n\t\t\t\t\tjQuery( sortableEl ).addClass( 'nf-droppable-hover' );\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * When a field type item is moved away from our sortable, we change the helper to its previous appearance\r\n\t\t * \r\n\t\t * @since  3.0\r\n\t\t * @param  Object \tui jQuery UI element\r\n\t\t * @return void\r\n\t\t */\r\n\t\toutStagedFields: function( ui ) {\r\n\t\t\tif( jQuery( ui.item ).hasClass( 'nf-field-type-draggable' ) ) {\r\n\t\t\t\tvar helperClone = nfRadio.channel( 'drawer-addField' ).request( 'get:typeHelperClone' );\t\r\n\t\t\t\tjQuery( this.currentHelper ).html( jQuery( helperClone ).html() );\r\n\t\t\t\tjQuery( this.currentHelper ).removeClass( 'nf-item-dock' ).addClass( 'nf-field-type-button' );\r\n\t\t\t\tvar sortableEl = nfRadio.channel( 'app' ).request( 'get:stagedFieldsEl' );\r\n\t\t\t\tif ( jQuery( sortableEl ).hasClass( 'ui-sortable' ) ) {\r\n\t\t\t\t\tjQuery( sortableEl ).removeClass( 'nf-droppable-hover' );\r\n\t\t\t\t}\r\n\t\t\t}\t\t\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * When a user starts to drag a sortable item, we need to set a few properties on the item and the helper.\r\n\t\t * These keep the original item in place while dragging and changes the opacity of the helper.\r\n\t\t * \r\n\t\t * @since  3.0\r\n\t\t * @param  Object\t ui jQuery UI element\r\n\t\t * @return void\r\n\t\t */\r\n\t\tstartStagedFields: function( ui ) {\r\n\t\t\tjQuery( ui.item ).show();\r\n\t\t\tjQuery( ui.item ).css( { 'display': 'inline', 'opacity': '0.7' } );\r\n\t\t\tjQuery( ui.helper ).css( 'opacity', '0.5' );\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * When we stop dragging a sortable item, remove our opacity setting and remove the helper item.\r\n\t\t * \r\n\t\t * @since  3.0\r\n\t\t * @param  Object\t ui jQuery UI element\r\n\t\t * @return void\r\n\t\t */\r\n\t\tstopStagedFields: function( ui ) {\r\n\t\t\tjQuery( ui.item ).css( 'opacity', '' );\r\n\t\t\tjQuery( ui.helper ).remove();\r\n\t\t}\r\n\r\n\t});\r\n\r\n\treturn controller;\r\n} );\n","/**\r\n * Filters our field type collection.\r\n * \r\n * @package Ninja Forms builder\r\n * @subpackage Fields - New Field Drawer\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'controllers/fields/filterTypes',['models/fields/typeSectionCollection'], function( fieldTypeSectionCollection ) {\r\n\tvar controller = Marionette.Object.extend( {\r\n\t\tinitialize: function() {\r\n\t\t\t// Listen to our change filter event.\r\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer-addField' ), 'change:filter', this.filterFieldTypes );\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Filter our field types in the add new field drawer\r\n\t\t * \r\n\t\t * Takes a search string and finds any field types that match either the name or alias.\r\n\t\t * \r\n\t\t * @since  3.0\r\n\t\t * @param  string\t search \tstring being searched for\r\n\t\t * @param  object \t e      \tKeyup event\r\n\t\t * @return void\r\n\t\t */\r\n\t\tfilterFieldTypes: function( search, e ) {\r\n\t\t\t// Make sure that we aren't dealing with an empty string.\r\n\t\t\tif ( '' != jQuery.trim( search ) ) {\r\n        \t\tvar filtered = [];\r\n        \t\t/**\r\n        \t\t * Call the function that actually filters our collection,\r\n        \t\t * and then loop through our collection, adding each model to our filtered array.\r\n        \t\t */\r\n        \t\t_.each( this.filterCollection( search ), function( model ) {\r\n        \t\t\tfiltered.push( model.get( 'id' ) );\r\n        \t\t} );\r\n\r\n        \t\t// Create a new Field Type Section collection with the filtered array.\r\n        \t\tvar filteredSectionCollection = new fieldTypeSectionCollection( [\r\n\t\t\t\t{ \r\n\t\t\t\t\tid: 'filtered',\r\n\t\t\t\t\tnicename: 'Filtered Fields',\r\n\t\t\t\t\tfieldTypes: filtered\r\n\t\t\t\t}\r\n\t\t\t\t] );\r\n\r\n        \t\t// Request that our field types filter be applied, passing the collection we created above.\r\n        \t\tnfRadio.channel( 'drawer' ).trigger( 'filter:fieldTypes', filteredSectionCollection );\r\n        \t\t// If we've pressed the 'enter' key, add the field to staging and clear the filter.\r\n        \t\tif ( 'undefined' != typeof e && e.addObject ) {\r\n        \t\t\tif ( 0 < filtered.length ) {\r\n        \t\t\t\tnfRadio.channel( 'fields' ).request( 'add:stagedField', filtered[0] );\r\n        \t\t\t\tnfRadio.channel( 'drawer' ).request( 'clear:filter' );\r\n        \t\t\t}\r\n        \t\t}\r\n        \t} else {\r\n        \t\t// Clear our filter if the search text is empty.\r\n        \t\tnfRadio.channel( 'drawer' ).trigger( 'clear:filter' );\r\n        \t}\r\n        },\r\n\r\n        /**\r\n         * Search our field type collection for the search string.\r\n         * \r\n         * @since  3.0\r\n         * @param  string\t search \tstring being searched for\r\n         * @return backbone.collection\r\n         */\r\n        filterCollection: function( search ) {\r\n        \tsearch = search.toLowerCase();\r\n        \t// Get our list of field types\r\n        \tvar collection = nfRadio.channel( 'fields' ).request( 'get:typeCollection' );\r\n        \t/*\r\n        \t * Backbone collections have a 'filter' method that loops through every model,\r\n        \t * waiting for you to return true or false. If you return true, the model is kept.\r\n        \t * If you return false, it's removed from the filtered result.\r\n        \t */\r\n\t\t\tvar filtered = collection.filter( function( model ) {\r\n\t\t\t\tvar found = false;\r\n\t\t\t\t\r\n\t\t\t\t// If we match either the ID or nicename, return true.\r\n\t\t\t\tif ( model.get( 'type' ).toLowerCase().indexOf( search ) != -1 ) {\r\n\t\t\t\t\tfound = true;\r\n\t\t\t\t} else if ( model.get( 'nicename' ).toLowerCase().indexOf( search ) != -1 ) {\r\n\t\t\t\t\tfound = true;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t/*\r\n\t\t\t\t * TODO: Hashtag searching. Doesn't really do anything atm.\r\n\t\t\t\t */\r\n\t\t\t\tif ( model.get( 'tags' ) && 0 == search.indexOf( '#' ) ) {\r\n\t\t\t\t\t_.each( model.get( 'tags' ), function( tag ) {\r\n\t\t\t\t\t\tif ( search.replace( '#', '' ).length > 1 ) {\r\n\t\t\t\t\t\t\tif ( tag.toLowerCase().indexOf( search.replace( '#', '' ) ) != -1 ) {\r\n\t\t\t\t\t\t\t\tfound = true;\r\n\t\t\t\t\t\t\t}\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t} );\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// If we match any of the aliases, return true.\r\n\t\t\t\tif ( model.get( 'alias' ) ) {\r\n\t\t\t\t\t_.each( model.get( 'alias' ), function( alias ) {\r\n\t\t\t\t\t\tif ( alias.toLowerCase().indexOf( search ) != -1 ) {\r\n\t\t\t\t\t\t\tfound = true;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t} );\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn found;\r\n\t\t\t} );\r\n\t\t\t// Return our filtered collection.\r\n\t\t\treturn filtered;\r\n        }\r\n\t});\r\n\r\n\treturn controller;\r\n} );\n","/**\r\n * Handles all the actions/functions related to our main field sortable.\r\n * All of the actual logic for our sortable is held here; the view just calls it using nfRadio.\r\n * \r\n * @package Ninja Forms builder\r\n * @subpackage Fields\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'controllers/fields/sortable',[], function() {\r\n\tvar controller = Marionette.Object.extend( {\r\n\t\tinitialize: function() {\r\n\t\t\t// When our field type buttons are dragged, we need to add or remove the active (blue) class.\r\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer-addField' ), 'startDrag:type', this.addActiveClass );\r\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer-addField' ), 'stopDrag:type', this.removeActiveClass );\r\n\t\t\t// When our field staging is dragged, we need to add or remove the active (blue) class.\r\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer-addField' ), 'startDrag:fieldStaging', this.addActiveClass );\r\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer-addField' ), 'stopDrag:fieldStaging', this.removeActiveClass );\r\n\t\t\t\r\n\t\t\t/*\r\n\t\t\t * Handles all the events fired by our sortable:\r\n\t\t\t * receive - dropped from type button or staging\r\n\t\t\t * over - dragging within or over the sortable\r\n\t\t\t * out - leaving the sortable\r\n\t\t\t * stop - stopped sorting/dragging\r\n\t\t\t * start - started sorting/dragging\r\n\t\t\t * update - stopped sorting/dragging and order has changed\r\n\t\t\t */\r\n\t\t\tnfRadio.channel( 'app' ).reply( 'receive:fieldsSortable', this.receiveFieldsSortable, this );\r\n\t\t\tnfRadio.channel( 'app' ).reply( 'over:fieldsSortable', this.overfieldsSortable, this );\r\n\t\t\tnfRadio.channel( 'app' ).reply( 'out:fieldsSortable', this.outFieldsSortable, this );\r\n\t\t\tnfRadio.channel( 'app' ).reply( 'stop:fieldsSortable', this.stopFieldsSortable, this );\r\n\t\t\tnfRadio.channel( 'app' ).reply( 'start:fieldsSortable', this.startFieldsSortable, this );\r\n\t\t\tnfRadio.channel( 'app' ).reply( 'update:fieldsSortable', this.updateFieldsSortable, this );\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Add the active class to our sortable so that its border is blue.\r\n\t\t * \r\n\t\t * @since 3.0\r\n\t\t * @return void\r\n\t\t */\r\n\t\taddActiveClass: function() {\r\n\t\t\tvar sortableEl = nfRadio.channel( 'fields' ).request( 'get:sortableEl' );\r\n\t\t\tjQuery( sortableEl ).addClass( 'nf-droppable-active' );\t\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Remove the active class from our sortable\r\n\t\t * \r\n\t\t * @since  3.0\r\n\t\t * @return void\r\n\t\t */\r\n\t\tremoveActiveClass: function() {\r\n\t\t\tvar sortableEl = nfRadio.channel( 'fields' ).request( 'get:sortableEl' );\r\n\t\t\tjQuery( sortableEl ).removeClass( 'nf-droppable-active' );\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Fires when we drop a field type button or staging onto our sortable\r\n\t\t * \r\n\t\t * @since  3.0\r\n\t\t * @param  Object \tui jQuery UI element\r\n\t\t * @return void\r\n\t\t */\r\n\t\treceiveFieldsSortable: function( ui ) {\r\n\t\t\t/*\r\n\t\t\t * We have to do different things if we're dealing with a field type button or staging area.\r\n\t\t\t */ \r\n\t\t\tif( jQuery( ui.item ).hasClass( 'nf-field-type-draggable' ) ) { // Field Type Button\r\n\t\t\t\t// Get our type string\r\n\t\t\t\tvar type = jQuery( ui.item ).data( 'id' );\r\n\t\t\t\t// Add a field (returns the tmp ID )\r\n\t\t\t\tvar tmpID = this.addField( type, false );\r\n\t\t\t\t/*\r\n\t\t\t\t * Update our helper id to the tmpID.\r\n\t\t\t\t * We do this so that when we sort, we have the proper ID.\r\n\t\t\t\t */ \r\n\t\t\t\tjQuery( ui.helper ).prop( 'id', tmpID );\r\n\t\t\t\tnfRadio.channel( 'fields' ).request( 'sort:fields' );\r\n\t\t\t\t// Remove the helper. Gets rid of a weird type artifact.\r\n\t\t\t\tjQuery( ui.helper ).remove();\r\n\t\t\t\t// Trigger a drop field type event.\r\n\t\t\t\tnfRadio.channel( 'fields' ).trigger( 'drop:fieldType', type, tmpID );\r\n\t\t\t} else if ( jQuery( ui.item ).hasClass( 'nf-stage' ) ) { // Staging\r\n\t\t\t\t// Later, we want to reference 'this' context, so we define it here.\r\n\t\t\t\tvar that = this;\r\n\t\t\t\t// Make sure that our staged fields are sorted properly.\t\r\n\t\t\t\tnfRadio.channel( 'fields' ).request( 'sort:staging' );\r\n\t\t\t\t// Grab our staged fields.\r\n\t\t\t\tvar stagedFields = nfRadio.channel( 'fields' ).request( 'get:staging' );\r\n\t\t\t\t// Get our current field order.\r\n\t\t\t\tvar sortableEl = nfRadio.channel( 'fields' ).request( 'get:sortableEl' );\r\n\t\t\t\t\r\n\t\t\t\tif ( jQuery( sortableEl ).hasClass( 'ui-sortable' ) ) { // Sortable isn't empty\r\n\t\t\t\t\t// If we're dealing with a sortable that isn't empty, get the order.\r\n\t\t\t\t\tvar order = jQuery( sortableEl ).sortable( 'toArray' );\r\n\t\t\t\t} else { // Sortable is empty\r\n\t\t\t\t\t// Sortable is empty, all we care about is our staged field draggable.\r\n\t\t\t\t\tvar order = ['nf-staged-fields-drag'];\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\t// Get the index of our droped element.\r\n\t\t\t\tvar insertedAt = order.indexOf( 'nf-staged-fields-drag' );\r\n\r\n\t\t\t\t// Loop through each staged fields model and insert a field.\r\n\t\t\t\tvar tmpIDs = [];\r\n\t\t\t\t_.each( stagedFields.models, function( field, index ) {\r\n\t\t\t\t\t// Add our field.\r\n\t\t\t\t\tvar tmpID = that.addField( field.get( 'slug' ) );\r\n\t\t\t\t\t// Add this newly created field to our order array.\r\n\t\t\t\t\torder.splice( insertedAt + index, 0, tmpID );\r\n\t\t\t\t} );\r\n\r\n\t\t\t\t// Remove our dropped element from our order array.\r\n\t\t\t\tvar insertedAt = order.indexOf( 'nf-staged-fields-drag' );\r\n\t\t\t\torder.splice( insertedAt, 1 );\r\n\t\t\t\t// Sort our fields\r\n\t\t\t\tnfRadio.channel( 'fields' ).request( 'sort:fields', order );\r\n\t\t\t\t// Clear our staging\r\n\t\t\t\tnfRadio.channel( 'fields' ).request( 'clear:staging' );\r\n\t\t\t\t// Remove our helper. Fixes a weird artifact.\r\n\t\t\t\tjQuery( ui.helper ).remove();\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Add a field.\r\n\t\t * Builds the object necessary to add a field to the field model collection.\r\n\t\t * \r\n\t\t * @since  3.0\r\n\t\t * @param  string \ttype   field type\r\n\t\t * @param  boolean \tsilent add silently\r\n\t\t * @return string \ttmpID\r\n\t\t */\r\n\t\taddField: function( type, silent ) {\r\n\t\t\t// Default to false\r\n\t\t\tsilent = silent || false;\r\n\t\t\t// Get our field type model\r\n\t\t\tvar fieldType = nfRadio.channel( 'fields' ).request( 'get:type', type ); \r\n\t\t\t// Get our tmp ID\r\n\t\t\tvar tmpID = nfRadio.channel( 'fields' ).request( 'get:tmpID' );\r\n\t\t\t// Add our field\r\n\t\t\tvar newModel = nfRadio.channel( 'fields' ).request( 'add',  { id: tmpID, label: fieldType.get( 'nicename' ), type: type }, silent );\r\n\t\t\t// Add our field addition to our change log.\r\n\t\t\tvar label = {\r\n\t\t\t\tobject: 'Field',\r\n\t\t\t\tlabel: newModel.get( 'label' ),\r\n\t\t\t\tchange: 'Added',\r\n\t\t\t\tdashicon: 'plus-alt'\r\n\t\t\t};\r\n\r\n\t\t\tvar data = {\r\n\t\t\t\tcollection: nfRadio.channel( 'fields' ).request( 'get:collection' )\r\n\t\t\t}\r\n\r\n\t\t\tnfRadio.channel( 'changes' ).request( 'register:change', 'addObject', newModel, null, label, data );\r\n\r\n\t\t\treturn tmpID;\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * When the user drags a field type or staging over our sortable, we need to modify the helper.\r\n\t\t * \r\n\t\t * @since  3.0\r\n\t\t * @param  Object \tui jQuery UI element\r\n\t\t * @return void\r\n\t\t */\r\n\t\toverfieldsSortable: function( ui ) {\r\n\t\t\tif( jQuery( ui.item ).hasClass( 'nf-field-type-draggable' ) ) { // Field Type\r\n\t\t\t\t// String type\r\n\t\t\t\tvar type = jQuery( ui.helper ).data( 'id' );\r\n\t\t\t\t// Get our field type model.\r\n\t\t\t\tvar fieldType = nfRadio.channel( 'fields' ).request( 'get:type', type );\r\n\t\t\t\t// Get our field type nicename.\r\n\t\t\t\tvar label = fieldType.get( 'nicename' );\r\n\t\t\t\t// Get our sortable element.\r\n\t\t\t\tvar sortableEl = nfRadio.channel( 'fields' ).request( 'get:sortableEl' );\r\n\t\t\t\t// Get our fieldwidth.\r\n\t\t\t\tvar fieldWidth = jQuery( sortableEl ).width();\r\n\t\t\t\t// Set our currentHelper to an object var so that we can access it later.\r\n\t\t\t\tthis.currentHelper = ui.helper;\r\n\t\t\t\t// Update our helper label.\r\n\t\t\t\tjQuery( ui.helper ).html( label );\r\n\t\t\t\t// Remove the field type draggable classes and add sortable classes.\r\n\t\t\t\tjQuery( ui.helper ).removeClass( 'nf-field-type-button' ).addClass( 'nf-field-wrap' ).css( { 'width': fieldWidth, 'height': '50px' } );\t\t\t\t\t\t\r\n\t\t\t\t// Add our hover class if our sortable has been initialized.\r\n\t\t\t\tif ( jQuery( sortableEl ).hasClass( 'ui-sortable' ) ) {\r\n\t\t\t\t\tjQuery( sortableEl ).addClass( 'nf-droppable-hover' );\r\n\t\t\t\t}\r\n\t\t\t} else if ( jQuery( ui.item ).hasClass( 'nf-stage' ) ) { // Staging\r\n\t\t\t\t// Get our sortable, and if it's initialized add our hover class.\r\n\t\t\t\tvar sortableEl = nfRadio.channel( 'fields' ).request( 'get:sortableEl' );\r\n\t\t\t\tif ( jQuery( sortableEl ).hasClass( 'ui-sortable' ) ) {\r\n\t\t\t\t\tjQuery( sortableEl ).addClass( 'nf-droppable-hover' );\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * When the user moves a draggable outside of the sortable, we need to change the helper.\r\n\t\t * This returns the item to its pre-over state.\r\n\t\t * \r\n\t\t * @since  3.0\r\n\t\t * @param  Object \tui jQuery UI element\r\n\t\t * @return void\r\n\t\t */\r\n\t\toutFieldsSortable: function( ui ) {\r\n\t\t\tif( jQuery( ui.item ).hasClass( 'nf-field-type-draggable' ) ) { // Field Type\r\n\t\t\t\t/*\r\n\t\t\t\t * Get our helper clone.\r\n\t\t\t\t * This will let us access the previous label and classes of our helper.\r\n\t\t\t\t */ \r\n\t\t\t\tvar helperClone = nfRadio.channel( 'drawer-addField' ).request( 'get:typeHelperClone' );\r\n\t\t\t\t// Set our helper label, remove our sortable class, and add the type class back to the type draggable.\r\n\t\t\t\tjQuery( this.currentHelper ).html( jQuery( helperClone ).html() );\r\n\t\t\t\tjQuery( this.currentHelper ).removeClass( 'nf-field-wrap' ).addClass( 'nf-field-type-button' ).css( { 'width': '', 'height': '' } );\r\n\t\t\t\t// Get our sortable and if it has been intialized, remove the droppable hover class.\r\n\t\t\t\tvar sortableEl = nfRadio.channel( 'fields' ).request( 'get:sortableEl' );\r\n\t\t\t\tif ( jQuery( sortableEl ).hasClass( 'ui-sortable' ) ) {\r\n\t\t\t\t\tjQuery( sortableEl ).removeClass( 'nf-droppable-hover' );\r\n\t\t\t\t}\r\n\t\t\t} else if ( jQuery( ui.item ).hasClass( 'nf-stage' ) ) { // Staging\r\n\t\t\t\t// If we've initialized our sortable, remove the droppable hover class.\r\n\t\t\t\tvar sortableEl = nfRadio.channel( 'fields' ).request( 'get:sortableEl' );\r\n\t\t\t\tif ( jQuery( sortableEl ).hasClass( 'ui-sortable' ) ) {\r\n\t\t\t\t\tjQuery( sortableEl ).removeClass( 'nf-droppable-hover' );\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * When we stop dragging in the sortable:\r\n\t\t * remove our opacity setting\r\n\t\t * remove our ui helper\r\n\t\t * \r\n\t\t * @since  3.0\r\n\t\t * @param  Object \tui jQuery UI element\r\n\t\t * @return void\r\n\t\t */\r\n\t\tstopFieldsSortable: function( ui ) {\r\n\t\t\tjQuery( ui.item ).css( 'opacity', '' );\r\n\t\t\tjQuery( ui.helper ).remove();\r\n\t\t\tnfRadio.channel( 'fields' ).trigger( 'sortable:stop', ui );\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * When we start dragging in the sortable:\r\n\t\t * add an opacity setting of 0.5\r\n\t\t * show our item (jQuery hides the original item by default)\r\n\t\t * \r\n\t\t * @since  3.0\r\n\t\t * @param  Object \tui jQuery UI element\r\n\t\t * @return void\r\n\t\t */\r\n\t\tstartFieldsSortable: function( ui ) {\r\n\t\t\t// If we aren't dragging an item in from types or staging, update our change log.\r\n\t\t\tif( ! jQuery( ui.item ).hasClass( 'nf-field-type-draggable' ) && ! jQuery( ui.item ).hasClass( 'nf-stage' ) ) { \r\n\t\t\t\tjQuery( ui.item ).css( 'opacity', '0.5' ).show();\r\n\t\t\t}\r\n\t\t\tnfRadio.channel( 'fields' ).trigger( 'sortable:start', ui );\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Sort our fields when we change the order.\r\n\t\t * \r\n\t\t * @since  3.0\r\n\t\t * @param  Object \tui jQuery UI element\r\n\t\t * @return void\r\n\t\t */\r\n\t\tupdateFieldsSortable: function( ui, sortable ) {\r\n\t\t\t\r\n\t\t\tnfRadio.channel( 'fields' ).request( 'sort:fields' );\r\n\r\n\t\t\t// If we aren't dragging an item in from types or staging, update our change log.\r\n\t\t\tif( ! jQuery( ui.item ).hasClass( 'nf-field-type-draggable' ) && ! jQuery( ui.item ).hasClass( 'nf-stage' ) ) { \r\n\r\n\t\t\t\tvar fieldCollection = nfRadio.channel( 'fields' ).request( 'get:collection' );\r\n\t\t\t\tvar dragFieldID = jQuery( ui.item ).prop( 'id' ).replace( 'field-', '' );\r\n\t\t\t\tvar dragModel = fieldCollection.get( dragFieldID );\r\n\r\n\t\t\t\t// Add our change event to the change tracker.\r\n\t\t\t\tvar data = { fields: [] };\r\n\t\t\t\t_.each( fieldCollection.models, function( field ) {\r\n\t\t\t\t\tvar oldPos = field._previousAttributes.order;\r\n\t\t\t\t\tvar newPos = field.get( 'order' );\r\n\t\t\t\t\t\r\n\t\t\t\t\tdata.fields.push( {\r\n\t\t\t\t\t\tmodel: field,\r\n\t\t\t\t\t\tattr: 'order',\r\n\t\t\t\t\t\tbefore: oldPos,\r\n\t\t\t\t\t\tafter: newPos\r\n\t\t\t\t\t} );\r\n\r\n\t\t\t\t} );\r\n\r\n\t\t\t\tvar label = {\r\n\t\t\t\t\tobject: 'Field',\r\n\t\t\t\t\tlabel: dragModel.get( 'label' ),\r\n\t\t\t\t\tchange: 'Re-ordered from ' + dragModel._previousAttributes.order + ' to ' + dragModel.get( 'order' ),\r\n\t\t\t\t\tdashicon: 'sort'\r\n\t\t\t\t};\r\n\r\n\t\t\t\tnfRadio.channel( 'changes' ).request( 'register:change', 'sortFields', dragModel, null, label, data );\r\n\t\t\t}\r\n\t\t}\r\n\t});\r\n\r\n\treturn controller;\r\n} );\n","/**\r\n * Handles interactions with our field collection.\r\n * \r\n * @package Ninja Forms builder\r\n * @subpackage Fields\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'controllers/fields/data',['models/fields/fieldCollection', 'models/fields/fieldModel'], function( fieldCollection, fieldModel ) {\r\n\tvar controller = Marionette.Object.extend( {\r\n\t\tadding: false,\r\n\t\tremoving: false,\r\n\t\t\r\n\t\tinitialize: function() {\r\n\t\t\t// Load our field collection from our localized form data\r\n\t\t\tthis.collection = new fieldCollection( preloadedFormData.fields );\r\n\t\t\t// Set our removedIDs to an empty object. This will be populated when a field is removed so that we can add it to our 'deleted_fields' object.\r\n\t\t\tthis.collection.removedIDs = {};\r\n\r\n\t\t\t// Respond to requests for data about fields and to update/change/delete fields from our collection.\r\n\t\t\tnfRadio.channel( 'fields' ).reply( 'get:collection', this.getFieldCollection, this );\r\n\t\t\tnfRadio.channel( 'fields' ).reply( 'get:field', this.getField, this );\r\n\t\t\tnfRadio.channel( 'fields' ).reply( 'redraw:collection', this.redrawFieldCollection, this );\r\n\t\t\tnfRadio.channel( 'fields' ).reply( 'get:tmpID', this.getTmpFieldID, this );\r\n\r\n\t\t\tnfRadio.channel( 'fields' ).reply( 'add', this.addField, this );\r\n\t\t\tnfRadio.channel( 'fields' ).reply( 'delete', this.deleteField, this );\r\n\t\t\tnfRadio.channel( 'fields' ).reply( 'sort:fields', this.sortFields, this );\r\n\r\n\t\t\t/*\r\n\t\t\t * Respond to requests to set our 'adding' and 'removing' state. This state is used to track whether or not\r\n\t\t\t * we should run animations in our fields collection.\r\n\t\t\t */\r\n\t\t\tnfRadio.channel( 'fields' ).reply( 'get:adding', this.getAdding, this );\r\n\t\t\tnfRadio.channel( 'fields' ).reply( 'set:adding', this.setAdding, this );\r\n\t\t\tnfRadio.channel( 'fields' ).reply( 'get:removing', this.getRemoving, this );\r\n\t\t\tnfRadio.channel( 'fields' ).reply( 'set:removing', this.setRemoving, this );\r\n\t\t},\r\n\r\n\t\tgetFieldCollection: function() {\r\n\t\t\treturn this.collection;\r\n\t\t},\r\n\r\n\t\tredrawFieldCollection: function() {\r\n\t\t\tthis.collection.trigger( 'reset', this.collection );\r\n\t\t},\r\n\r\n\t\tgetField: function( id ) {\r\n\t\t\tif ( this.collection.findWhere( { key: id } ) ) {\r\n\t\t\t\t/*\r\n\t\t\t\t * First we check to see if a key matches what we were sent.\r\n\t\t\t\t */\t\t\t\t\r\n\t\t\t\treturn this.collection.findWhere( { key: id } );\r\n\t\t\t} else {\r\n\t\t\t\t/*\r\n\t\t\t\t * If it doesn't, we try to return an ID that matches.\r\n\t\t\t\t */\r\n\t\t\t\treturn this.collection.get( id );\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Add a field to our collection. If silent is passed as true, no events will trigger.\r\n\t\t * \r\n\t\t * @since 3.0\r\n\t\t * @param Object \tdata \t\t\tfield data to insert\r\n\t\t * @param bool \t\tsilent \t\t\tprevent events from firing as a result of adding\r\n\t\t * @param bool  \trenderTrigger\tshould this cause the view to re-render?\r\n\t\t * @param string  \taction\t\t\taction context - are we performing a higher level action? i.e. duplicate\r\n\t\t */\r\n\t\taddField: function( data, silent, renderTrigger, action ) {\r\n\r\n\t\t\t/*\r\n\t\t\t * Set our fields 'adding' value to true. This enables our add field animation.\r\n\t\t\t */\r\n\t\t\tnfRadio.channel( 'fields' ).request( 'set:adding', true );\r\n\r\n\t\t\tsilent = silent || false;\r\n\t\t\taction = action || '';\r\n\t\t\trenderTrigger = ( 'undefined' == typeof renderTrigger ) ? true : renderTrigger;\r\n\r\n\t\t\tif ( false === data instanceof Backbone.Model ) {\r\n\t\t\t\tif ( 'undefined' == typeof ( data.id ) ) {\r\n\t\t\t\t\tdata.id = this.getTmpFieldID();\r\n\t\t\t\t}\r\n\t\t\t\tvar model = new fieldModel( data );\r\n\t\t\t} else {\r\n\t\t\t\tvar model = data;\r\n\t\t\t}\r\n\r\n\t\t\t// console.log( model );\r\n\r\n\t\t\t/*\r\n\t\t\t * TODO: Add an nfRadio message filter for the model variable.\r\n\t\t\t * Currently, we manually replace for saved fields; this should be moved to a separate controller.\r\n\t\t\t * \r\n\t\t\t * If we're adding a saved field, make sure that we set the type to the parentType.\r\n\t\t\t */\r\n\r\n\t\t\tif ( jQuery.isNumeric( model.get( 'type' ) ) ) {\r\n\t\t\t\tvar savedType = nfRadio.channel( 'fields' ).request( 'get:type', model.get( 'type' ) );\r\n\t\t\t\tmodel.set( 'type', savedType.get( 'parentType' ) );\r\n\t\t\t}\r\n\r\n\t\t\tvar newModel = this.collection.add( model, { silent: silent } );\r\n\t\t\t\r\n\t\t\t// Set our 'clean' status to false so that we get a notice to publish changes\r\n\t\t\tnfRadio.channel( 'app' ).request( 'update:setting', 'clean', false );\r\n\t\t\tnfRadio.channel( 'fields' ).trigger( 'add:field', model );\r\n\t\t\tif ( renderTrigger ) {\r\n\t\t\t\tnfRadio.channel( 'fields' ).trigger( 'render:newField', newModel, action );\r\n\t\t\t}\r\n\t\t\tif( 'duplicate' == action ){\r\n                nfRadio.channel( 'fields' ).trigger( 'render:duplicateField', newModel, action );\r\n\t\t\t}\r\n\t\t\tnfRadio.channel( 'fields' ).trigger( 'after:addField', model );\r\n\t\t\t\r\n\t\t\treturn model;\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Update a field setting by ID\r\n\t\t * \r\n\t\t * @since  3.0\r\n\t\t * @param  int \t\tid    field id\r\n\t\t * @param  string \tname  setting name\r\n\t\t * @param  mixed \tvalue setting value\r\n\t\t * @return void\r\n\t\t */\r\n\t\tupdateFieldSetting: function( id, name, value ) {\r\n\t\t\tvar fieldModel = this.collection.get( id );\r\n\t\t\tfieldModel.set( name, value );\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Get our fields sortable EL\r\n\t\t * \r\n\t\t * @since  3.0\r\n\t\t * @param  Array \torder optional order array like: [field-1, field-4, field-2]\r\n\t\t * @return void\r\n\t\t */\r\n\t\tsortFields: function( order, ui, updateDB ) {\r\n\t\t\tif ( null == updateDB ) {\r\n\t\t\t\tupdateDB = true;\r\n\t\t\t}\r\n\t\t\t// Get our sortable element\r\n\t\t\tvar sortableEl = nfRadio.channel( 'fields' ).request( 'get:sortableEl' );\r\n\t\t\tif ( jQuery( sortableEl ).hasClass( 'ui-sortable' ) ) { // Make sure that sortable is enabled\r\n\t\t\t\t// JS ternerary for setting our order\r\n\t\t\t\tvar order = order || jQuery( sortableEl ).sortable( 'toArray' );\r\n\r\n\t\t\t\t// Loop through all of our fields and update their order value\r\n\t\t\t\t_.each( this.collection.models, function( field ) {\r\n\t\t\t\t\t// Get our current position.\r\n\t\t\t\t\tvar oldPos = field.get( 'order' );\r\n\t\t\t\t\tvar id = field.get( 'id' );\r\n\t\t\t\t\tif ( jQuery.isNumeric( id ) ) {\r\n\t\t\t\t\t\tvar search = 'field-' + id;\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tvar search = id;\r\n\t\t\t\t\t}\r\n\t\t\t\t\t\r\n\t\t\t\t\t// Get the index of our field inside our order array\r\n\t\t\t\t\tvar newPos = order.indexOf( search ) + 1;\r\n\t\t\t\t\tfield.set( 'order', newPos );\r\n\t\t\t\t} );\r\n\t\t\t\tthis.collection.sort();\r\n\r\n\t\t\t\tif ( updateDB ) {\r\n\t\t\t\t\t// Set our 'clean' status to false so that we get a notice to publish changes\r\n\t\t\t\t\tnfRadio.channel( 'app' ).request( 'update:setting', 'clean', false );\r\n\t\t\t\t\t// Update our preview\r\n\t\t\t\t\tnfRadio.channel( 'app' ).request( 'update:db' );\t\t\t\t\t\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Delete a field from our collection.\r\n\t\t * \r\n\t\t * @since  3.0\r\n\t\t * @param  backbone.model \tmodel \tfield model to be deleted\r\n\t\t * @return void\r\n\t\t */\r\n\t\tdeleteField: function( model ) {\r\n\t\t\tnfRadio.channel( 'fields' ).trigger( 'delete:field', model );\r\n\t\t\tthis.removing = true;\r\n\t\t\tthis.collection.remove( model );\r\n\t\t\t\r\n\t\t\t// Set our 'clean' status to false so that we get a notice to publish changes\r\n\t\t\tnfRadio.channel( 'app' ).request( 'update:setting', 'clean', false );\r\n\t\t\tnfRadio.channel( 'app' ).request( 'update:db' );\r\n\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Return a new tmp id for our fields.\r\n\t\t * Gets the field collection length, adds 1, then returns that prepended with 'tmp-'.\r\n\t\t * \r\n\t\t * @since  3.0\r\n\t\t * @return string\r\n\t\t */\r\n\t\tgetTmpFieldID: function() {\r\n\t\t\tvar tmpNum = this.collection.tmpNum;\r\n\t\t\tthis.collection.tmpNum++;\r\n\t\t\treturn 'tmp-' + tmpNum;\r\n\t\t},\r\n\r\n\t\tgetAdding: function() {\r\n\t\t\treturn this.adding;\r\n\t\t},\r\n\r\n\t\tsetAdding: function( val ) {\r\n\t\t\tthis.adding = val;\r\n\t\t},\r\n\r\n\t\tgetRemoving: function() {\r\n\t\t\treturn this.removing;\r\n\t\t},\r\n\r\n\t\tsetRemoving: function( val ) {\r\n\t\t\tthis.removing = val;\r\n\t\t}\r\n\t});\r\n\r\n\treturn controller;\r\n} );\n","/**\r\n * Model for our repeater option.\r\n * \r\n * @package Ninja App builder\r\n * @subpackage Fields\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'models/app/optionRepeaterModel',[], function() {\r\n\tvar model = Backbone.Model.extend( {\r\n\t\tdefaults: {\r\n\t\t\terrors: {},\r\n            max_options: 0,\r\n\t\t},\r\n\r\n\t\tinitialize: function() {\r\n\t\t\t// When we add errors to the option row, run a function.\r\n\t\t\tthis.on( 'change:errors', this.changeErrors, this );\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * When we change the errors on our model, check to see if we should add or remove \r\n\t\t * the error from the setting that this option is a part of.\r\n\t\t *\r\n\t\t * Adding an error to the setting model simply disables the drawer and other\r\n\t\t * navigation. As long as we have one option with an error, it should be set to true.\r\n\t\t * \r\n\t\t * @since  3.0\r\n\t\t * @return void\r\n\t\t */\r\n\t\tchangeErrors: function( model ) {\r\n\t\t\t/*\r\n\t\t\t * The errors attribute will be an object, so if we don't have any keys, it's empty.\r\n\t\t\t * If we have an empty object, check to see if we can remove the error from our setting model.\r\n\t\t\t */\r\n\r\n\t\t\tif ( 0 == _.size( model.get( 'errors' ) ) ) {\r\n\t\t\t\t/*\r\n\t\t\t\t * Loop through our collection to see if we have any other errors.\r\n\t\t\t\t */\r\n\t\t\t\tvar errorsFound = false;\r\n\t\t\t\t_.each( model.collection.models, function( opt ) {\r\n\t\t\t\t\tif ( 0 != _.size( opt.get( 'errors' ) ) ) {\r\n\t\t\t\t\t\terrorsFound = true;\r\n\t\t\t\t\t}\r\n\t\t\t\t} );\r\n\t\t\t\tif ( ! errorsFound ) {\r\n\t\t\t\t\tmodel.collection.settingModel.set( 'error', false );\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\t/*\r\n\t\t\t\t * We have errors, so make sure that the setting model has an error set.\r\n\t\t\t\t */\r\n\t\t\t\tmodel.collection.settingModel.set( 'error', true );\r\n\t\t\t}\r\n\t\t}\r\n\t} );\r\n\t\r\n\treturn model;\r\n} );\n","/**\r\n * Model that represents our list options.\r\n * \r\n * @package Ninja Forms builder\r\n * @subpackage Fields\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'models/app/optionRepeaterCollection',['models/app/optionRepeaterModel'], function( listOptionModel ) {\r\n\tvar collection = Backbone.Collection.extend( {\r\n\t\tmodel: listOptionModel,\r\n\t\tcomparator: 'order',\r\n\r\n\t\tinitialize: function( models, options ) {\r\n\t\t\t// Listen to the 'sort' event\r\n\t\t\tthis.on( 'sort', this.changeCollection, this );\r\n\t\t\t// Listen to the 'add' event\r\n\t\t\tthis.on( 'add', this.addOption, this );\r\n\t\t\tthis.settingModel = options.settingModel;\r\n\t\t},\r\n\r\n\t\tchangeCollection: function() {\r\n\t\t\t// Trigger a 'sort:options' event so that our field model can update\r\n\t\t\tnfRadio.channel( 'option-repeater' ).trigger( 'sort:options', this );\r\n\t\t\tnfRadio.channel( 'option-repeater-' + this.settingModel.get( 'name' ) ).trigger( 'sort:options', this );\r\n\t\t},\r\n\r\n\t\taddOption: function( model, collection ) {\r\n\t\t\tmodel.set( 'settingModel', this.settingModel );\r\n\t\t}\r\n\t} );\r\n\treturn collection;\r\n} );\n","define( 'views/app/drawer/optionRepeaterError',[], function() {\r\n\tvar view = Marionette.ItemView.extend({\r\n\t\ttagName: 'div',\r\n\t\tclassName: 'nf-error',\r\n\t\ttemplate: '#tmpl-nf-edit-setting-option-repeater-error',\r\n\r\n\t\ttemplateHelpers: function() {\r\n\t\t\tvar that = this;\r\n\t\t\treturn {\r\n\t\t\t\trenderErrors: function() {\r\n\t\t\t\t    if ( 'undefined' != typeof that.errors ) {\r\n    \t\t\t\t\treturn that.errors[ Object.keys( errors )[0] ];\r\n \t\t\t\t\t} else {\r\n \t\t\t\t\t\treturn '';\r\n \t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t});\r\n\r\n\treturn view;\r\n} );\n","define( 'views/app/drawer/optionRepeaterOption',['views/app/drawer/optionRepeaterError'], function( ErrorView ) {\r\n\tvar view = Marionette.LayoutView.extend({\r\n\t\ttagName: 'div',\r\n\t\tclassName: 'nf-table-row',\r\n\t\ttemplate: '#tmpl-nf-edit-setting-option-repeater-default-row',\r\n\t\tid: function() {\r\n\t\t\treturn this.model.cid;\r\n\t\t},\r\n\r\n\t\tregions: {\r\n\t\t\terror: '.nf-option-error'\r\n\t\t},\r\n\r\n\t\tinitialize: function( data ) {\r\n\t\t\tthis.settingModel = data.settingModel;\r\n\t\t\tthis.dataModel = data.dataModel;\r\n\t\t\tthis.collection = data.collection;\r\n\t\t\tthis.columns = data.columns;\r\n\t\t\tthis.parentView = data.parentView;\r\n\t\t\tthis.model.on( 'change:errors', this.renderErrors, this );\r\n\r\n\t\t\t// Removed because the re-render was breaking tag insertion for merge tags.\r\n\t\t\t// this.model.on( 'change', this.render, this );\r\n\r\n\t\t\tif ( 'undefined' != typeof this.settingModel.get( 'tmpl_row' ) ) {\r\n\t\t\t\tthis.template = '#' + this.settingModel.get( 'tmpl_row' );\r\n\t\t\t}\r\n\r\n\t\t\tthis.hasErrors = false;\r\n\t\t},\r\n\r\n\t\tonBeforeDestroy: function() {\t\r\n\t\t\tthis.model.off( 'change', this.render );\r\n\t\t\tthis.model.off( 'change:errors', this.renderErrors );\r\n\t\t},\r\n\r\n\t\tonBeforeRender: function() {\r\n\t\t\t/*\r\n\t\t\t * We want to escape any HTML being output for our label.\r\n\t\t\t */\r\n\t\t\tif ( this.model.get( 'label' ) ) {\r\n\t\t\t\tvar label = this.model.get( 'label' );\r\n\t\t\t\tthis.model.set( 'label', _.escape( label ), { silent: true } );\r\n\t\t\t}\r\n\t\t\t\r\n\t\t},\r\n\r\n\t\tonRender: function() {\r\n\t\t\tnfRadio.channel( 'mergeTags' ).request( 'init', this );\r\n\t\t\t/*\r\n\t\t\t * Send out a radio message.\r\n\t\t\t */\r\n\t\t\tnfRadio.channel( 'setting-' + this.settingModel.get( 'name' ) + '-option' ).trigger( 'render:setting', this.model, this.dataModel, this );\r\n\t\t\t/*\r\n\t\t\t * We want to unescape any HTML being output for our label.\r\n\t\t\t */\r\n\t\t\tif ( this.model.get( 'label' ) ) {\r\n\t\t\t\tvar label = this.model.get( 'label' );\r\n\t\t\t\tthis.model.set( 'label', _.unescape( label ), { silent: true } );\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\tonShow: function() {\r\n\t\t\tif ( this.model.get( 'new' ) ) {\r\n\t\t\t\tjQuery( this.el ).find( 'input:first' ).focus();\r\n\t\t\t\tthis.model.set( 'new', false );\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\tevents: {\r\n\t\t\t'change .setting': 'changeOption',\r\n\t\t\t'click .nf-delete': 'deleteOption',\r\n\t\t\t'keyup': 'keyupOption'\r\n\t\t},\r\n\r\n\t\tchangeOption: function( e ) {\r\n\t\t\tnfRadio.channel( 'option-repeater' ).trigger( 'change:option', e, this.model, this.dataModel, this.settingModel, this );\r\n\t\t},\r\n\r\n\t\tdeleteOption: function( e ) {\r\n\t\t\tnfRadio.channel( 'option-repeater' ).trigger( 'click:deleteOption', this.model, this.collection, this.dataModel, this );\r\n\t\t},\r\n\r\n\t\tkeyupOption: function( e ) {\r\n\t\t\tthis.maybeAddOption( e );\r\n\t\t\tnfRadio.channel( 'option-repeater' ).trigger( 'keyup:option', e, this.model, this.dataModel, this.settingModel, this )\r\n\t\t\tnfRadio.channel( 'option-repeater-' + this.settingModel.get( 'name' ) ).trigger( 'keyup:option', e, this.model, this.dataModel, this.settingModel, this )\r\n\t\t},\r\n\r\n\t\tmaybeAddOption: function( e ) {\r\n\t\t\tif ( 13 == e.keyCode && 'calculations' != this.settingModel.get( 'name' ) ) {\r\n\t\t\t\tnfRadio.channel( 'option-repeater' ).trigger( 'click:addOption', this.collection, this.dataModel, this );\r\n\t\t\t\tjQuery( this.parentView.children.findByIndex(this.parentView.children.length - 1).el ).find( '[data-id=\"label\"]' ).focus();\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\trenderErrors: function() {\r\n\t\t\t\r\n\t\t\t// if ( jQuery.isEmptyObject( this.model.get( 'errors' ) ) ) {\r\n\t\t\t// \treturn false;\r\n\t\t\t// }\r\n\r\n\t\t\t/*\r\n\t\t\t * We don't want to redraw the entire row, which would remove focus from the eq textarea,\r\n\t\t\t * so we add and remove error classes manually.\r\n\t\t\t */\r\n\t\t\tif ( 0 == Object.keys( this.model.get( 'errors' ) ) ) {\r\n                if ( this.hasErrors ) {\r\n\t\t\t\t    this.error.empty();\r\n\t\t\t\t    jQuery( this.el ).removeClass( 'nf-error' );\r\n                }\r\n\t\t\t} else {\r\n\t\t\t\tthis.hasErrors = true;\r\n\t\t\t\tthis.error.show( new ErrorView( { model: this.model } ) );\r\n\t\t\t\tjQuery( this.el ).addClass( 'nf-error' );\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\ttemplateHelpers: function() {\r\n\t\t\tvar that = this;\r\n\t\t\treturn {\r\n\t\t\t\tgetColumns: function() {\r\n\t\t\t\t\treturn that.columns;\r\n\t\t\t\t},\r\n\t\t\t\trenderFieldSelect: function( dataID, value ){\r\n\t\t\t\t\tvar fields = nfRadio.channel( 'fields' ).request( 'get:collection' );\r\n\t\t\t\t\tvar _return = '<label class=\"nf-select\"><select class=\"setting\" data-id=\"' + dataID + '\">';\r\n                    _return += '<option value=\"\" >--</option>';\r\n\t\t\t\t\tfields.each( function( field ){\r\n\t\t\t\t\t\tvar selected = ( value == field.get( 'key' ) ) ? ' selected' : '';\r\n\t\t\t\t\t\t_return += '<option value=\"' + field.get( 'key' ) + '\"' + selected + '>' + field.get( 'label' ) + '</option>';\r\n\t\t\t\t\t});\r\n\t\t\t\t\t_return += '</select><div></div></label>';\r\n\t\t\t\t\treturn _return;\r\n\t\t\t\t},\r\n\t\t\t\trenderOptions: function( column, value ) {\r\n\r\n\t\t\t\t\tif( 'undefined' == typeof that.options.columns[ column ] ) return;\r\n\r\n\t\t\t\t\tvar html = '';\r\n\t\t\t\t\t_.each( that.options.columns[ column ].options, function( option ){\r\n\t\t\t\t\t\tvar selected = ( value == option.value ) ? ' selected' : '';\r\n\t\t\t\t\t\thtml += '<option value=\"' + option.value + '\"' +  selected + '>' + option.label + '</option>';\r\n\t\t\t\t\t});\r\n\t\t\t\t\t\r\n\t\t\t\t\treturn html;\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t});\r\n\r\n\treturn view;\r\n} );\r\n\n","define( 'views/app/drawer/optionRepeaterEmpty',[], function() {\r\n\tvar view = Marionette.ItemView.extend({\r\n\t\ttagName: 'tr',\r\n\t\ttemplate: '#tmpl-nf-edit-setting-option-repeater-empty'\r\n\t});\r\n\r\n\treturn view;\r\n} );\n","define( 'views/app/drawer/optionRepeaterComposite',['views/app/drawer/optionRepeaterOption', 'views/app/drawer/optionRepeaterEmpty', 'models/app/optionRepeaterCollection'], function( listOptionView, listEmptyView, listOptionCollection ) {\r\n\tvar view = Marionette.CompositeView.extend( {\r\n\t\ttemplate: '#tmpl-nf-edit-setting-option-repeater-wrap',\r\n\t\tchildView: listOptionView,\r\n\t\temptyView: listEmptyView,\r\n\t\treorderOnSort: false,\r\n\r\n\t\tinitialize: function( data ) {\r\n\r\n\t\t\t/*\r\n\t\t\t * Our options are stored in our database as objects, not collections.\r\n\t\t\t * Before we attempt to render them, we need to convert them to a collection if they aren't already one.\r\n\t\t\t */ \r\n\t\t\tvar optionCollection = data.dataModel.get( this.model.get( 'name' ) );\r\n\r\n\t\t\tif ( false == optionCollection instanceof Backbone.Collection ) {\r\n\t\t\t\toptionCollection = new listOptionCollection( [], { settingModel: this.model } );\r\n\t\t\t\toptionCollection.add( data.dataModel.get( this.model.get( 'name' ) ) );\r\n\t\t\t\tdata.dataModel.set( this.model.get( 'name' ), optionCollection, { silent: true } );\r\n\t\t\t}\r\n\r\n\t\t\tthis.collection = optionCollection;\r\n\t\t\tthis.dataModel = data.dataModel;\r\n\t\t\tthis.childViewOptions = { parentView: this, settingModel: this.model, collection: this.collection, dataModel: data.dataModel, columns: this.model.get( 'columns' ) };\r\n\r\n\t\t\tvar deps = this.model.get( 'deps' );\r\n\t\t\tif ( deps ) {\r\n\t\t\t\tfor ( var name in deps ) {\r\n\t\t\t\t    if ( deps.hasOwnProperty( name ) ) {\r\n\t\t\t\t    \tthis.dataModel.on( 'change:' + name, this.render, this );\r\n\t\t\t\t    }\r\n\t\t\t\t}\r\n\t\t\t}\r\n            this.listenTo( nfRadio.channel( 'option-repeater' ), 'added:option', this.maybeHideNew );\r\n            this.listenTo( nfRadio.channel( 'option-repeater' ), 'removed:option', this.maybeHideNew );\r\n\t\t},\r\n\r\n\t\tonBeforeDestroy: function() {\r\n\t\t\tvar deps = this.model.get( 'deps' );\r\n\t\t\tif ( deps ) {\r\n\t\t\t\tfor (var name in deps) {\r\n\t\t\t\t    if ( deps.hasOwnProperty( name ) ) {\r\n\t\t\t\t    \tthis.dataModel.off( 'change:' + name, this.render );\r\n\t\t\t\t    }\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\tonRender: function() {\r\n\t\t\t// this.$el = this.$el.children();\r\n\t\t\t// this.$el.unwrap();\r\n\t\t\t// this.setElement( this.$el );\r\n\r\n\t\t\t// this.$el = this.$el.children();\r\n\t\t\t// this.$el.unwrap();\r\n\t\t\t// this.setElement( this.$el );\r\n\t\t\r\n\t\t\tvar that = this;\r\n\t\t\tjQuery( this.el ).find( '.nf-list-options-tbody' ).sortable( {\r\n\t\t\t\thandle: '.handle',\r\n\t\t\t\thelper: 'clone',\r\n\t\t\t\tplaceholder: 'nf-list-options-sortable-placeholder',\r\n\t\t\t\tforcePlaceholderSize: true,\r\n\t\t\t\topacity: 0.95,\r\n\t\t\t\ttolerance: 'pointer',\r\n\r\n\t\t\t\tstart: function( e, ui ) {\r\n\t\t\t\t\tnfRadio.channel( 'option-repeater' ).request( 'start:optionSortable', ui );\r\n\t\t\t\t},\r\n\r\n\t\t\t\tstop: function( e, ui ) {\r\n\t\t\t\t\tnfRadio.channel( 'option-repeater' ).request( 'stop:optionSortable', ui );\r\n\t\t\t\t},\r\n\r\n\t\t\t\tupdate: function( e, ui ) {\r\n\t\t\t\t\tnfRadio.channel( 'option-repeater' ).request( 'update:optionSortable', ui, this, that );\r\n\t\t\t\t}\r\n\t\t\t} );\r\n            that.maybeHideNew( that.collection );\r\n\r\n\t\t\t/*\r\n\t\t\t * Send out a radio message.\r\n\t\t\t */\r\n\t\t\tnfRadio.channel( 'setting-' + this.model.get( 'name' ) ).trigger( 'render:setting', this.model, this.dataModel, this );\r\n\t\t\r\n\t\t},\r\n\r\n\t\tonAttach: function() {\r\n            \r\n\t\t\tvar importLink = jQuery( this.el ).find( '.nf-open-import-tooltip' );\r\n\t\t\tvar jBox = jQuery( importLink ).jBox( 'Tooltip', {\r\n                title: '<h3>Please enter your options below:</h3>',\r\n                content: jQuery( this.el ).find( '.nf-import-options' ),\r\n                trigger: 'click',\r\n                closeOnClick: 'body',\r\n                closeButton: 'box',\r\n                offset: { x: 20, y: 0 },\r\n                addClass: 'import-options',\r\n\r\n                onOpen: function() {\r\n                \tvar that = this;\r\n                \tsetTimeout( function() { jQuery( that.content ).find( 'textarea' ).focus(); }, 200 );\r\n                }\r\n            } );\r\n\r\n\t\t\tjQuery( this.el ).find( '.nf-import' ).on( 'click', { view: this, jBox: jBox }, this.clickImport );\r\n\r\n\t\t\t/*\r\n\t\t\t * Send out a radio message.\r\n\t\t\t */\r\n\t\t\tnfRadio.channel( 'setting-' + this.model.get( 'name' ) ).trigger( 'attach:setting', this.model, this.dataModel, this );\r\n\t\t\tnfRadio.channel( 'setting-type-' + this.model.get( 'type' ) ).trigger( 'attach:setting', this.model, this.dataModel, this );\r\n\t\t},\r\n\r\n\t\ttemplateHelpers: function () {\r\n\t\t\tvar that = this;\r\n\t    \treturn {\r\n\t    \t\trenderHeaders: function() {\r\n\t    \t\t\tvar columns = '<div>&nbsp;</div>';\r\n\t    \t\t\t_.each( this.columns, function( col ) {\r\n\t    \t\t\t\tcolumns += '<div>' + col.header + '</div>';\r\n\t    \t\t\t} );\r\n\t    \t\t\tcolumns += '<div>&nbsp;</div>';\r\n\t\t\t\t\treturn columns;\r\n\t\t\t\t},\r\n\r\n\t    \t\trenderSetting: function() {\r\n\t    \t\t\tvar setting = nfRadio.channel( 'app' ).request( 'get:template',  '#tmpl-nf-edit-setting-' + this.type );\r\n\t\t\t\t\treturn setting( this );\r\n\t\t\t\t},\r\n\r\n\t\t\t\trenderClasses: function() {\r\n\t\t\t\t\tvar classes = '';\r\n\t\t\t\t\tif ( 'undefined' != typeof this.width ) {\r\n\t\t\t\t\t\tclasses += this.width;\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tclasses += ' one-half';\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif ( this.error ) {\r\n\t\t\t\t\t\tclasses += ' nf-error';\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\treturn classes;\r\n\t\t\t\t},\r\n\r\n\t\t\t\trenderVisible: function() {\r\n\t\t\t\t\tif ( this.deps ) {\r\n\t\t\t\t\t\tfor (var name in this.deps) {\r\n\t\t\t\t\t\t    if ( this.deps.hasOwnProperty( name ) ) {\r\n\t\t\t\t\t\t        if ( that.dataModel.get( name ) !== this.deps[ name ] ) {\r\n\t\t\t\t\t\t        \treturn 'style=\"display:none;\"';\r\n\t\t\t\t\t\t        }\r\n\t\t\t\t\t\t    }\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t    \t\t\treturn '';\r\n\t    \t\t},\r\n\r\n\t\t\t\trenderError: function() {\r\n\t\t\t\t\tif ( this.error ) {\r\n\t\t\t\t\t\treturn this.error;\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn '';\r\n\t\t\t\t},\r\n\r\n\t\t\t\trenderFieldsetClasses: function() {\r\n\t\t\t\t\treturn that.model.get( 'name' );\r\n\t\t\t\t},\r\n\r\n\t\t\t\tcurrencySymbol: function() {\r\n\t\t\t\t\treturn nfRadio.channel( 'settings' ).request( 'get:setting', 'currency' ) || nfi18n.currency_symbol;\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t},\r\n\r\n\t\tattachHtml: function( collectionView, childView ) {\r\n\t\t\tjQuery( collectionView.el ).find( '.nf-list-options-tbody' ).append( childView.el );\r\n\t\t\tnfRadio.channel( 'mergeTags' ).request( 'init', this );\r\n\t\t},\r\n\r\n\t\tevents: {\r\n\t\t\t'click .nf-add-new': 'clickAddOption',\r\n\t\t\t'click .extra': 'clickExtra'\r\n\t\t},\r\n        \r\n        maybeHideNew: function( collection ) {\r\n\t\t\tif( 'undefined' == typeof collection.settingModel ) return false;\r\n            var limit = collection.settingModel.get( 'max_options' );\r\n            if( 0 !== limit && collection.models.length >= ( limit ) ) {\r\n                jQuery(this.el).find('.nf-add-new').addClass('disabled');\r\n            } else {\r\n                jQuery(this.el).find('.nf-add-new').removeClass('disabled');\r\n            }\r\n        },\r\n\r\n\t\tclickAddOption: function( e ) {\r\n\t\t\tnfRadio.channel( 'option-repeater' ).trigger( 'click:addOption', this.collection, this.dataModel );\r\n\t\t\tjQuery( this.children.findByIndex(this.children.length - 1).el ).find( '[data-id=\"label\"]' ).focus();\r\n\t\t},\r\n\r\n\t\tclickExtra: function( e ) {\r\n\t\t\tnfRadio.channel( 'option-repeater' ).trigger( 'click:extra', e, this.collection, this.dataModel );\r\n\t\t\tnfRadio.channel( 'option-repeater-' + this.model.get( 'name' ) ).trigger( 'click:extra', e, this.model, this.collection, this.dataModel );\r\n\t\t},\r\n\r\n\t\tclickImport: function( e ) {\r\n\t\t\tvar textarea = jQuery( e.data.jBox.content ).find( 'textarea' );\r\n\t\t\tvar value = textarea.val().trimLeft().trimRight();\r\n\t\t\t/*\r\n\t\t\t * Return early if we have no strings.\r\n\t\t\t */\r\n\t\t\tif ( 0 == value.length ) {\r\n\t\t\t\te.data.jBox.close();\r\n\t\t\t\treturn false;\r\n\t\t\t}\t\t\t\r\n\t\t\t/*\r\n\t\t\t * Split our value based on new lines.\r\n\t\t\t */\r\n\r\n\t\t\tvar lines = value.split(/\\n/);\r\n\t\t\tif ( _.isArray( lines ) ) {\r\n\t\t\t\t/*\r\n\t\t\t\t * Loop over \r\n\t\t\t\t */\r\n\t\t\t\t_.each( lines, function( line ) {\r\n\t\t\t\t\tvar row = line.split( ',' );\r\n\t\t\t\t\tvar label = row[0];\r\n\t\t\t\t\tvar value = row[1] || jQuery.slugify( label, { separator: '-' } );\r\n\t\t\t\t\tvar calc = row[2] || '';\r\n\r\n\t\t\t\t\tlabel = label.trimLeft().trimRight();\r\n\t\t\t\t\tvalue = value.trimLeft().trimRight();\r\n\t\t\t\t\tcalc = calc.trimLeft().trimRight();\r\n\t\t\t\t\t/*\r\n\t\t\t\t\t * Add our row to the collection\r\n\t\t\t\t\t */\r\n\t\t\t\t\tvar model = e.data.view.collection.add( { label: row[0], value: value, calc: calc } );\r\n\t\t\t\t\t// Add our field addition to our change log.\r\n\t\t\t\t\tvar label = {\r\n\t\t\t\t\t\tobject: 'field',\r\n\t\t\t\t\t\tlabel: row[0],\r\n\t\t\t\t\t\tchange: 'Option Added',\r\n\t\t\t\t\t\tdashicon: 'plus-alt'\r\n\t\t\t\t\t};\r\n\r\n\t\t\t\t\tnfRadio.channel( 'changes' ).request( 'register:change', 'addListOption', model, null, label );\r\n\t\t\t\t\tnfRadio.channel( 'option-repeater-' + e.data.view.model.get( 'name' ) ).trigger( 'add:option', model );\r\n\t\t\t\t\tnfRadio.channel( 'option-repeater' ).trigger( 'add:option', model );\r\n\t\t\t\t\tnfRadio.channel( 'app' ).trigger( 'update:setting', model );\r\n\t\t\t\t}, this );\r\n\t\t\t\t/*\r\n\t\t\t\t * Set our state to unclean so that the user can publish.\r\n\t\t\t\t */\r\n\t\t\t} else {\r\n\t\t\t\t/*\r\n\t\t\t\t * TODO: Error Handling Here\r\n\t\t\t\t */\r\n\t\t\t}\r\n\t\t\ttextarea.val( '' );\r\n\t\t\te.data.jBox.close();\r\n\t\t},\r\n\t} );\r\n\r\n\treturn view;\r\n} );\n","/**\r\n * Handles tasks associated with our option-repeater.\r\n * \r\n * Return our repeater child view.\r\n *\r\n * Also listens for changes to the options settings.\r\n * \r\n * @package Ninja Forms builder\r\n * @subpackage App\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'controllers/app/optionRepeater',['models/app/optionRepeaterModel', 'models/app/optionRepeaterCollection', 'views/app/drawer/optionRepeaterComposite'], function( listOptionModel, listOptionCollection, listCompositeView ) {\r\n\tvar controller = Marionette.Object.extend( {\r\n\t\tinitialize: function() {\r\n\t\t\t// Respond to requests for the childView for list type fields.\r\n\t\t\tnfRadio.channel( 'option-repeater' ).reply( 'get:settingChildView', this.getSettingChildView, this );\r\n\t\t\t\r\n\t\t\t// Listen for changes to our list options.\r\n\t\t\tthis.listenTo( nfRadio.channel( 'option-repeater' ), 'change:option', this.changeOption );\r\n\t\t\tthis.listenTo( nfRadio.channel( 'option-repeater' ), 'click:addOption', this.addOption );\r\n\t\t\tthis.listenTo( nfRadio.channel( 'option-repeater' ), 'click:deleteOption', this.deleteOption );\r\n\r\n\t\t\t// Respond to requests related to our list options sortable.\r\n\t\t\tnfRadio.channel( 'option-repeater' ).reply( 'update:optionSortable', this.updateOptionSortable, this );\r\n\t\t\tnfRadio.channel( 'option-repeater' ).reply( 'stop:optionSortable', this.stopOptionSortable, this );\r\n\t\t\tnfRadio.channel( 'option-repeater' ).reply( 'start:optionSortable', this.startOptionSortable, this );\r\n\t\t\r\n\t\t\t/**\r\n\t\t\t * When we init our setting model, we need to convert our array/objects into collections/models\r\n\t\t\t */\r\n\t\t\tthis.listenTo( nfRadio.channel( 'option-repeater' ), 'init:dataModel', this.convertSettings );\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Update an option value in our model.\r\n\t\t * \r\n\t\t * @since  3.0\r\n\t\t * @param  Object\t\t\te          event\r\n\t\t * @param  backbone.model \tmodel      option model\r\n\t\t * @param  backbone.model \tdataModel\r\n\t\t * @return void\r\n\t\t */\r\n\t\tchangeOption: function( e, model, dataModel, settingModel, optionView ) {\r\n\t\t\tvar name = jQuery( e.target ).data( 'id' );\r\n\t\t\tif ( 'selected' == name ) {\r\n\t\t\t\tif ( jQuery( e.target ).attr( 'checked' ) ) {\r\n\t\t\t\t\tvar value = 1;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tvar value = 0;\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tvar value = jQuery( e.target ).val();\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tvar before = model.get( name );\r\n\t\t\t\r\n\t\t\tmodel.set( name, value );\r\n\t\t\t// Trigger an update on our dataModel\r\n\t\t\tthis.triggerDataModel( model, dataModel );\r\n\r\n\t\t\tvar after = value;\r\n\t\t\t\r\n\t\t\tvar changes = {\r\n\t\t\t\tattr: name,\r\n\t\t\t\tbefore: before,\r\n\t\t\t\tafter: after\r\n\t\t\t}\r\n\r\n\t\t\tvar label = {\r\n\t\t\t\tobject: dataModel.get( 'objectType' ),\r\n\t\t\t\tlabel: dataModel.get( 'label' ),\r\n\t\t\t\tchange: 'Option ' + model.get( 'label' ) + ' ' + name + ' changed from ' + before + ' to ' + after\r\n\t\t\t};\r\n\r\n\t\t\tnfRadio.channel( 'changes' ).request( 'register:change', 'changeSetting', model, changes, label );\r\n\t\t\tnfRadio.channel( 'option-repeater' ).trigger( 'update:option', model, dataModel, settingModel, optionView );\r\n\t\t\tnfRadio.channel( 'option-repeater-option-' + name  ).trigger( 'update:option', e, model, dataModel, settingModel, optionView );\r\n\t\t\tnfRadio.channel( 'option-repeater-' + settingModel.get( 'name' ) ).trigger( 'update:option', model, dataModel, settingModel, optionView );\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Add an option to our list\r\n\t\t * \r\n\t\t * @since 3.0\r\n\t\t * @param backbone.collection \tcollection \tlist option collection\r\n\t\t * @param backbone.model \t\tdataModel\r\n\t\t * @return void\r\n\t\t */\r\n\t\taddOption: function( collection, dataModel ) {\r\n\t\t\tvar modelData = {\r\n\t\t\t\torder: collection.length,\r\n\t\t\t\tnew: true,\r\n\t\t\t\toptions: {}\r\n\t\t\t};\r\n            var limit = collection.settingModel.get( 'max_options' );\r\n            if( 0 !== limit && collection.models.length >= limit ) {\r\n                return;\r\n            }\r\n\t\t\t_.each( collection.settingModel.get( 'columns' ), function( col, key ) {\r\n\t\t\t\tmodelData[ key ] = col.default;\r\n\r\n\t\t\t\tif( 'undefined' != typeof col.options ){\r\n\t\t\t\t\tmodelData.options[ key ] = col.options;\r\n\t\t\t\t}\r\n\t\t\t} );\r\n\t\t\tvar model = new listOptionModel( modelData );\r\n\t\t\tcollection.add( model );\r\n\r\n\t\t\t// Add our field addition to our change log.\r\n\t\t\tvar label = {\r\n\t\t\t\tobject: dataModel.get( 'objectType' ),\r\n\t\t\t\tlabel: dataModel.get( 'label' ),\r\n\t\t\t\tchange: 'Option Added',\r\n\t\t\t\tdashicon: 'plus-alt'\r\n\t\t\t};\r\n\r\n\t\t\tnfRadio.channel( 'changes' ).request( 'register:change', 'addListOption', model, null, label );\r\n\t\t\tnfRadio.channel( 'option-repeater-' + collection.settingModel.get( 'name' ) ).trigger( 'add:option', model );\r\n\t\t\tnfRadio.channel( 'option-repeater' ).trigger( 'add:option', model );\r\n\t\t\tnfRadio.channel( 'option-repeater' ).trigger( 'added:option', collection );\r\n\t\t\tthis.triggerDataModel( model, dataModel );\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Delete an option from our list\r\n\t\t * \r\n\t\t * @since  3.0\r\n\t\t * @param backbone.model \t\tmodel       list option model\r\n\t\t * @param backbone.collection \tcollection \tlist option collection\r\n\t\t * @param backbone.model \t\tdataModel\r\n\t\t * @return void\r\n\t\t */\r\n\t\tdeleteOption: function( model, collection, dataModel ) {\r\n\t\t\tvar newModel = nfRadio.channel( 'app' ).request( 'clone:modelDeep', model );\r\n\r\n\t\t\t// Add our field deletion to our change log.\r\n\t\t\tvar label = {\r\n\t\t\t\tobject: dataModel.get( 'objectType' ),\r\n\t\t\t\tlabel: dataModel.get( 'label' ),\r\n\t\t\t\tchange: 'Option ' + newModel.get( 'label' ) + ' Removed',\r\n\t\t\t\tdashicon: 'dismiss'\r\n\t\t\t};\r\n\r\n\t\t\tvar data = {\r\n\t\t\t\tcollection: collection\r\n\t\t\t}\r\n\r\n\t\t\tnfRadio.channel( 'changes' ).request( 'register:change', 'removeListOption', newModel, null, label, data );\r\n\t\t\t\r\n\t\t\tvar changeCollection = nfRadio.channel( 'changes' ).request( 'get:collection' );\r\n\t\t\tvar results = changeCollection.where( { model: model } );\r\n\r\n\t\t\t_.each( results, function( changeModel ) {\r\n\t\t\t\tif ( 'object' == typeof changeModel.get( 'data' ) ) {\r\n\t\t\t\t\t_.each( changeModel.get( 'data' ), function( dataModel ) {\r\n\t\t\t\t\t\tif ( dataModel.model == dataModel ) {\r\n\t\t\t\t\t\t\tdataModel.model = newModel;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t} );\r\n\t\t\t\t}\r\n\t\t\t\tchangeModel.set( 'model', newModel );\r\n\t\t\t\tchangeModel.set( 'disabled', true );\r\n\t\t\t} );\r\n\r\n\t\t\tcollection.remove( model );\r\n\t\t\tnfRadio.channel( 'option-repeater' ).trigger( 'remove:option', model );\r\n\t\t\tnfRadio.channel( 'option-repeater' ).trigger( 'removed:option', collection );\r\n\t\t\tnfRadio.channel( 'option-repeater-' + collection.settingModel.get( 'name' ) ).trigger( 'remove:option', model );\r\n\t\t\tthis.triggerDataModel( model, dataModel );\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Creates an arbitrary value on our collection, then clones and updates that collection.\r\n\t\t * This forces a change event to be fired on the dataModel where the list option collection data is stored.\r\n\t\t * \r\n\t\t * @since  3.0\r\n\t\t * @param backbone.collection \tcollection \tlist option collection\r\n\t\t * @param backbone.model \t\tdataModel\r\n\t\t * @return void\r\n\t\t */\r\n\t\ttriggerDataModel: function( model, dataModel ) {\r\n\t\t\tnfRadio.channel( 'app' ).trigger( 'update:setting', model );\t\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Return our list composite view to the setting collection view.\r\n\t\t * \r\n\t\t * @since  3.0\r\n\t\t * @param  backbone.model \tmodel \tsettings model\r\n\t\t * @return void\r\n\t\t */\r\n\t\tgetSettingChildView: function( model ) {\r\n\t\t\treturn listCompositeView;\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * When we sort our list options, change the order in our option model and trigger a change.\r\n\t\t * \r\n\t\t * @since  3.0\r\n\t\t * @param  Object\t \t\tsortable \tjQuery UI element\r\n\t\t * @param  backbone.view \tsetting  \tSetting view\r\n\t\t * @return void\r\n\t\t */\r\n\t\tupdateOptionSortable: function( ui, sortable, setting ) {\r\n\t\t\tvar newOrder = jQuery( sortable ).sortable( 'toArray' );\r\n\t\t\tvar dragModel = setting.collection.get( { cid: jQuery( ui.item ).prop( 'id' ) } );\r\n\t\t\tvar data = {\r\n\t\t\t\tcollection: setting.collection,\r\n\t\t\t\tobjModels: []\r\n\t\t\t};\r\n\r\n\t\t\t_.each( newOrder, function( cid, index ) {\r\n\t\t\t\tvar optionModel = setting.collection.get( { cid: cid } );\r\n\t\t\t\tvar oldPos = optionModel.get( 'order' );\r\n\t\t\t\toptionModel.set( 'order', index );\r\n\t\t\t\tvar newPos = index;\r\n\r\n\t\t\t\tdata.objModels.push( {\r\n\t\t\t\t\tmodel: optionModel,\r\n\t\t\t\t\tattr: 'order',\r\n\t\t\t\t\tbefore: oldPos,\r\n\t\t\t\t\tafter: newPos\r\n\t\t\t\t} );\r\n\t\t\t} );\r\n\t\t\t\r\n\t\t\tsetting.collection.sort( { silent: true } );\r\n\t\t\t\r\n\t\t\tvar label = {\r\n\t\t\t\tobject: setting.dataModel.get( 'objectType' ),\r\n\t\t\t\tlabel: setting.dataModel.get( 'label' ),\r\n\t\t\t\tchange: 'Option ' + dragModel.get( 'label' ) + ' re-ordered from ' + dragModel._previousAttributes.order + ' to ' + dragModel.get( 'order' ),\r\n\t\t\t\tdashicon: 'sort'\r\n\t\t\t};\r\n\r\n\t\t\tnfRadio.channel( 'changes' ).request( 'register:change', 'sortListOptions', dragModel, null, label, data );\r\n\t\t\tthis.triggerDataModel( dragModel, setting.dataModel );\r\n\t\t\tnfRadio.channel( 'option-repeater' ).trigger( 'sort:option', dragModel, setting );\r\n\t\t\tnfRadio.channel( 'option-repeater-' + setting.model.get( 'name' ) ).trigger( 'sort:option', dragModel, setting );\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * When we stop sorting our list options, reset our item opacity.\r\n\t\t * \r\n\t\t * @since  3.0\r\n\t\t * @param  Object ui jQuery UI element\r\n\t\t * @return void\r\n\t\t */\r\n\t\tstopOptionSortable: function( ui ) {\r\n\t\t\tjQuery( ui.item ).css( 'opacity', '' );\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * When we start sorting our list options, remove containing divs and set our item opacity to 0.5\r\n\t\t * \r\n\t\t * @since  3.0\r\n\t\t * @param  Objects ui jQuery UI element\r\n\t\t * @return void\r\n\t\t */\r\n\t\tstartOptionSortable: function( ui ) {\r\n\t\t\tjQuery( ui.placeholder ).find( 'div' ).remove();\r\n\t\t\tjQuery( ui.item ).css( 'opacity', '0.5' ).show();\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Convert settings from an array/object to a collection/model\r\n\t\t * \r\n\t\t * @since  3.0\r\n\t\t * @param  Backbone.Model dataModel\r\n\t\t * @param  Backbone.Model settingModel\r\n\t\t * @return void\r\n\t\t */\r\n\t\tconvertSettings: function( dataModel, settingModel ) {\r\n\t\t\t/*\r\n\t\t\t * Our options are stored in our database as objects, not collections.\r\n\t\t\t * Before we attempt to render them, we need to convert them to a collection if they aren't already one.\r\n\t\t\t */ \r\n\t\t\tvar optionCollection = dataModel.get( settingModel.get( 'name' ) );\r\n\r\n\t\t\tif ( false == optionCollection instanceof Backbone.Collection ) {\r\n\t\t\t\toptionCollection = new listOptionCollection( [], { settingModel: settingModel } );\r\n\t\t\t\toptionCollection.add( dataModel.get( settingModel.get( 'name' ) ) );\r\n\t\t\t\tdataModel.set( settingModel.get( 'name' ), optionCollection, { silent: true } );\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t});\r\n\r\n\treturn controller;\r\n} );\n","/**\r\n * Handles adding and removing the active class from a field currently being edited.\r\n * \r\n * @package Ninja Forms builder\r\n * @subpackage Fields - Edit Field Drawer\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'controllers/fields/editActive',[], function() {\r\n\tvar controller = Marionette.Object.extend( {\r\n\t\tinitialize: function() {\r\n\t\t\t// Respond to requests to remove the active class from all our fields.\r\n\t\t\tnfRadio.channel( 'fields' ).reply( 'clear:editActive', this.clearEditActive, this );\r\n\t\t\t// Listen for the closing drawer so that we can remove all of our active classes.\r\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer-editSettings' ), 'before:closeDrawer', this.clearEditActive );\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Loops through our fields collection and sets editActive to false.\r\n\t\t * \r\n\t\t * @since  3.0\r\n\t\t * @return void\r\n\t\t */\r\n        clearEditActive: function() {\r\n            var fieldCollection = nfRadio.channel( 'fields' ).request( 'get:collection' );\r\n            _.each( fieldCollection.models, function( field ) {\r\n\t\t\t\tfield.set( 'editActive', false );\r\n            } );\r\n        }\r\n\t});\r\n\r\n\treturn controller;\r\n} );\r\n\n","/**\r\n * Fetches settings models so that we can get setting information\r\n * \r\n * @package Ninja Forms builder\r\n * @subpackage Main App\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'controllers/fields/fieldSettings',['models/app/settingCollection'], function( settingCollection ) {\r\n\tvar controller = Marionette.Object.extend( {\r\n\t\tinitialize: function() {\r\n\t\t\tthis.collection = new settingCollection( fieldSettings, { objectType: 'fields' } );\r\n\r\n\t\t\t// Responds to requests for settings models.\r\n\t\t\tnfRadio.channel( 'fields' ).reply( 'get:settingModel', this.getSettingModel, this );\r\n\t\t\t\r\n\t\t\t// Responds to requests for our collection.\r\n\t\t\tnfRadio.channel( 'fields' ).reply( 'get:settingCollection', this.getSettingCollection, this );\r\n\t\t},\r\n\r\n\t\tgetSettingModel: function( name ) {\r\n\t\t\treturn this.collection.findWhere( { name: name } );\r\n\t\t},\r\n\r\n\t\tgetSettingCollection: function() {\r\n\t\t\treturn this.collection;\r\n\t\t}\r\n\r\n\t});\r\n\r\n\treturn controller;\r\n} );\n","/**\r\n * Listens to our app channel to add the individual Credit Card Fields.\r\n *\r\n * @package Ninja Forms builder\r\n * @subpackage Main App\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'controllers/fields/fieldCreditCard',[], function() {\r\n    var controller = Marionette.Object.extend( {\r\n        initialize: function() {\r\n          this.listenTo( nfRadio.channel( 'fields' ), 'after:addField', this.dropCreditCardField );\r\n        },\r\n\r\n        dropCreditCardField: function( fieldModel ) {\r\n\r\n            if( 'creditcard' == fieldModel.get( 'type' ) ) {\r\n\r\n                var order = fieldModel.get( 'order' );\r\n\r\n                nfRadio.channel( 'fields' ).request( 'delete', fieldModel );\r\n\r\n                _.each( [ 'creditcardfullname', 'creditcardnumber', 'creditcardcvc', 'creditcardexpiration', 'creditcardzip'], function( type ) {\r\n\r\n                    var fieldType = nfRadio.channel( 'fields' ).request( 'get:type', type );\r\n\r\n                    var newField = {\r\n                        id: nfRadio.channel( 'fields' ).request( 'get:tmpID' ),\r\n                        type: type,\r\n                        label: fieldType.get( 'nicename' ),\r\n                        order: order\r\n                    };\r\n\r\n                    nfRadio.channel( 'fields' ).request( 'add', newField );\r\n                });\r\n            }\r\n\r\n        },\r\n\r\n        stageCreditCardField: function( model ) {\r\n\r\n            if( 'creditcard' == model.get( 'slug' ) ) {\r\n\r\n                nfRadio.channel( 'fields' ).request( 'remove:stagedField', '', model );\r\n\r\n                _.each( [ 'creditcardfullname', 'creditcardnumber', 'creditcardcvc', 'creditcardexpiration', 'creditcardzip'], function( type ) {\r\n                    nfRadio.channel('fields').request('add:stagedField', type );\r\n                });\r\n            }\r\n        }\r\n\r\n    });\r\n\r\n    return controller;\r\n} );\n","/**\r\n * Listens to our app channel to add the individual List Fields.\r\n *\r\n * @package Ninja Forms builder\r\n * @subpackage Main App\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'controllers/fields/fieldList',[ 'models/app/optionRepeaterCollection' ], function( ListOptionCollection ) {\r\n    var controller = Marionette.Object.extend( {\r\n        initialize: function() {\r\n            this.listenTo( nfRadio.channel( 'option-repeater-option-label' ), 'update:option', this.updateOptionLabel );\r\n            this.listenTo( nfRadio.channel( 'option-repeater-option-value' ), 'update:option', this.updateOptionValue );\r\n            \r\n            /*\r\n             * When we init our model, convert our options from an array of objects to a collection of models.\r\n             */\r\n            this.listenTo( nfRadio.channel( 'fields-list' ), 'init:fieldModel', this.convertOptions );\r\n        },\r\n\r\n        updateOptionLabel: function( e, model, dataModel, settingModel, optionView ) {\r\n\r\n            if( 'list' != _.findWhere( fieldTypeData, { id: dataModel.get( 'type' ) } ).parentType ) return;\r\n\r\n            if( model.get( 'manual_value' ) ) return;\r\n\r\n            value = jQuery.slugify( model.get( 'label' ), { separator: '-' } );\r\n\r\n            model.set( 'value', value );\r\n            model.trigger( 'change', model );\r\n\r\n            // Set focus on value input\r\n            jQuery( optionView.el ).find( '[data-id=\"value\"]' ).focus().select();\r\n        },\r\n\r\n        updateOptionValue: function( e, model, dataModel, settingModel, optionView ) {\r\n\r\n            var findWhere = _.findWhere( fieldTypeData, { id: dataModel.get( 'type' ) } );\r\n            if( 'undefined' == typeof findWhere ) return;\r\n            if( 'list' != findWhere.parentType ) return;\r\n\r\n            model.set( 'manual_value', true );\r\n            \r\n            // Set focus on calc input\r\n            jQuery( optionView.el ).find( '[data-id=\"calc\"]' ).focus().select();\r\n        },\r\n\r\n        convertOptions: function( fieldModel ) {\r\n            /*\r\n             * Our options are stored in our database as objects, not collections.\r\n             * Before we attempt to render them, we need to convert them to a collection if they aren't already one.\r\n             */ \r\n            var options = fieldModel.get( 'options' );\r\n\r\n            var settingModel = nfRadio.channel( 'fields' ).request( 'get:settingModel', 'options' );\r\n\r\n            if ( false == options instanceof Backbone.Collection ) {\r\n                options = new ListOptionCollection( [], { settingModel: settingModel } );\r\n                options.add( fieldModel.get( 'options' ) );\r\n                fieldModel.set( 'options', options, { silent: true } );\r\n            }\r\n        }\r\n\r\n    });\r\n\r\n    return controller;\r\n} );\n","/**\r\n * Listens to our app channel to add the individual Credit Card Fields.\r\n *\r\n * @package Ninja Forms builder\r\n * @subpackage Main App\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'controllers/fields/fieldPassword',[], function() {\r\n    var controller = Marionette.Object.extend( {\r\n        initialize: function() {\r\n            this.listenTo( nfRadio.channel( 'fields' ), 'after:addField', this.addField );\r\n        },\r\n\r\n        addField: function( model ) {\r\n\r\n            if( 'password' == model.get( 'type' ) ) {\r\n\r\n                var order = model.get( 'order' );\r\n\r\n                var confirm = this.insertField( 'passwordconfirm', order + 1 );\r\n\r\n                confirm.set( 'confirm_field', model.get( 'key' ) );\r\n            }\r\n        },\r\n\r\n        insertField: function( type, order ) {\r\n            var fieldType = nfRadio.channel( 'fields' ).request( 'get:type', type );\r\n\r\n            var newField = {\r\n                id: nfRadio.channel( 'fields' ).request( 'get:tmpID' ),\r\n                type: type,\r\n                label: fieldType.get( 'nicename' ),\r\n                order: order\r\n            };\r\n\r\n            return nfRadio.channel('fields').request('add', newField );\r\n        }\r\n    });\r\n\r\n    return controller;\r\n} );\n","/**\r\n * Listens to our app channel for settings views being rendered.\r\n *\r\n * If we're rendering a product_assignment setting, add our products to the data model.\r\n * \r\n * @package Ninja Forms builder\r\n * @subpackage Main App\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'controllers/fields/fieldQuantity',[], function() {\r\n\tvar controller = Marionette.Object.extend( {\r\n\t\tinitialize: function() {\r\n\t\t\t// Listen for messages that are fired before a setting view is rendered.\r\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'before:renderSetting', this.beforeRenderSetting );\r\n\t\t},\r\n\r\n\t\tbeforeRenderSetting: function( settingModel, dataModel, view ) {\r\n\t\t\tif ( 'product_assignment' == settingModel.get( 'name' ) ) {\r\n\t\t\t\tvar productFields = this.getProductFields( settingModel );\r\n\t\t\t\tsettingModel.set( 'options', productFields );\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\tgetProductFields: function( settingModel ) {\r\n\t\t\tvar productFields = [ settingModel.get( 'select_product' ) ];\r\n\t\t\t// Update our dataModel with all of our product fields.\r\n\t\t\tvar fields = nfRadio.channel( 'fields' ).request( 'get:collection' );\r\n\t\t\t_.each( fields.models, function( field ) {\r\n\t\t\t\tif ( 'product' == field.get( 'type' ) ) {\r\n\t\t\t\t\tproductFields.push( { label: field.get( 'label' ), value: field.get( 'id' ) } );\r\n\t\t\t\t}\r\n\t\t\t} );\r\n\t\t\treturn productFields;\r\n\t\t}\r\n\r\n\t});\r\n\r\n\treturn controller;\r\n} );\n","/**\r\n * Listens to our app channel for settings views being rendered.\r\n *\r\n * If we're rendering a product_assignment setting, add our products to the data model.\r\n * \r\n * @package Ninja Forms builder\r\n * @subpackage Main App\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'controllers/fields/fieldShipping',[], function() {\r\n\tvar controller = Marionette.Object.extend( {\r\n\t\tinitialize: function() {\r\n\t\t\tthis.listenTo( nfRadio.channel( 'setting-shipping_options' ), 'render:setting', this.addMask );\r\n\t\t\tthis.listenTo( nfRadio.channel( 'setting-shipping_options-option' ), 'render:setting', this.addMask );\r\n\t\t},\r\n\r\n\t\taddMask: function( settingModel, dataModel, view ) {\r\n\t\t\tjQuery( view.el ).find( '[data-id=\"value\"]' ).each( function() {\r\n\t\t\t\tjQuery( this ).autoNumeric({\r\n\t\t\t\t\taSign: '$', // TODO: Use form setting\r\n\t\t\t\t\taSep: thousandsSeparator,\r\n\t\t\t\t\taDec: decimalPoint\r\n\t\t\t\t});\r\n\t\t\t} );\r\n\t\t}\r\n\t});\r\n\r\n\treturn controller;\r\n} );\n","/**\r\n * When we add a new field, update its key.\r\n *\r\n * When we change the key, update any refs to the key.\r\n *\r\n * @package Ninja Forms builder\r\n * @subpackage Fields\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'controllers/fields/key',[], function() {\r\n\tvar controller = Marionette.Object.extend( {\r\n\t\tinitialize: function() {\r\n\t\t\t// When we add a field, update its key.\r\n\t\t\tthis.listenTo( nfRadio.channel( 'fields' ), 'add:field', this.newFieldKey );\r\n\r\n\t\t\t// When we edit a label, update our key.\r\n\t\t\tthis.listenTo( nfRadio.channel( 'fieldSetting-label' ), 'update:setting', this.updateLabel );\r\n\r\n\t\t\t// When we edit a key, check for places that key might be used.\r\n\t\t\tthis.listenTo( nfRadio.channel( 'fieldSetting-key' ), 'update:setting', this.updateKey );\r\n\r\n\t\t\t// When we type inside the admin key field, we need to save our manual_key setting.\r\n\t\t\tthis.listenTo( nfRadio.channel( 'setting-key' ), 'keyup:setting', this.keyUp );\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Add a key to our new field model.\r\n\t\t *\r\n\t\t * @since 3.0\r\n\t\t * @param backbone.model model new field model\r\n\t\t * @return void\r\n\t\t */\r\n\t\tnewFieldKey: function( model ) {\r\n\t\t\tvar d = new Date();\r\n\t\t\tvar n = d.valueOf();\r\n\t\t\tvar key = this.slugify( model.get( 'type' ) + '_' + n );\r\n\r\n\t\t\tmodel.set( 'key', key, { silent: true } );\r\n\r\n\t\t\tif( 'undefined' == model.get( 'manual_key' ) ) {\r\n\t\t\t\tmodel.set('manual_key', false, {silent: true});\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\tupdateLabel: function( model ) {\r\n\r\n\t\t\t/*\r\n\t\t\t * If we haven't entered a key manually, update our key when our label changes.\r\n\t\t\t */\r\n\t\t\tif ( ! model.get( 'manual_key' ) && 0 != jQuery.trim( model.get( 'label' ) ).length ) {\r\n\t\t\t\t/*\r\n\t\t\t\t * When we're editing settings, we expect the edits to fire one at a time.\r\n\t\t\t\t * Since we're calling this in the middle of our label update, anything that inquires about what has changed after we set our key will see both label and key.\r\n\t\t\t\t * We need to remove the label from our model.changed property so that all that has changed is the key.\r\n\t\t\t\t *\r\n\t\t\t\t */\r\n\t\t\t\tdelete model.changed.label;\r\n\t\t\t\tvar d = new Date();\r\n\t\t\t\tvar n = d.valueOf();\r\n\t\t\t\tvar key = this.slugify( model.get( 'label' ) + '_' + n );\r\n\t\t\t\tmodel.set( 'key', key );\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * When a field key is updated, find any merge tags using the key and update them.\r\n\t\t *\r\n\t\t * @since  3.0\r\n\t\t * @param  backbone.model model field model\r\n\t\t * @return void\r\n\t\t */\r\n\t\tupdateKey: function( dataModel ) {\r\n\t\t\tvar key = dataModel.get( 'key' );\r\n\t\t\tthis.settingModel = nfRadio.channel( 'fields' ).request( 'get:settingModel', 'key' );\r\n\t\t\tthis.setError( key, dataModel );\r\n\t\t},\r\n\r\n\t\tkeyUp: function( e, settingModel, dataModel ) {\r\n\t\t\tdataModel.set( 'manual_key', true );\r\n\t\t\tthis.settingModel = settingModel;\r\n\t\t\tvar key = jQuery( e.target ).val();\r\n\t\t\tthis.setError( key, dataModel );\r\n\t\t},\r\n\r\n\t\tsetError: function( key, dataModel ) {\r\n\t\t\tvar error = false;\r\n\t\t\tif ( '' == jQuery.trim( key ) ) {\r\n\t\t\t\terror = 'Field keys can\\'t be empty. Please enter a key.';\r\n\t\t\t} else if ( key != key.toLowerCase() ) {\r\n\t\t\t\terror = 'Field keys must be lowercase.';\r\n\t\t\t} else if ( key != key.replace( ' ', '_' ) ) {\r\n\t\t\t\terror = 'Field keys must cannot use spaces. Separate with \"_\" instead.';\r\n\t\t\t} else if ( '_' == key.slice( -1 ) ) {\r\n\t\t\t\terror = 'Field keys cannot end with a \"_\"';\r\n\t\t\t} else if ( key != this.slugify( key ) ) {\r\n\t\t\t\terror = 'Invalid Format.';\r\n\t\t\t} else if ( key != this.keyExists( key, dataModel ) ) {\r\n\t\t\t\terror = 'Field keys must be unique. Please enter another key.'\r\n\t\t\t}\r\n\r\n\t\t\tif ( error ) {\r\n\t\t\t\tthis.settingModel.set( 'error', error );\r\n\t\t\t} else {\r\n\t\t\t\tnfRadio.channel( 'app' ).trigger( 'update:fieldKey', dataModel );\r\n\t\t\t\tthis.settingModel.set( 'error', false );\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\tkeyExists: function( key, dataModel ) {\r\n\t\t\tvar newKey = this.slugify( key );\r\n\t\t\tif ( 0 != newKey.length ) {\r\n\t\t\t\tkey = newKey;\r\n\t\t\t}\r\n\t\t\tvar fieldCollection = nfRadio.channel( 'fields' ).request( 'get:collection' );\r\n\t\t\tvar x = 1;\r\n\t\t\tvar testKey = key;\r\n\t\t\t_.each( fieldCollection.models, function( field ) {\r\n\t\t\t\tif ( dataModel != field && testKey == field.get( 'key' ) ) {\r\n\t\t\t\t\ttestKey = key + '_' + x;\r\n\t\t\t\t\tx++;\r\n\t\t\t\t}\r\n\t\t\t} );\r\n\r\n\t\t\tkey = testKey;\r\n\r\n\t\t\treturn key;\r\n\t\t},\r\n\r\n\t\tslugify: function( string ){\r\n\t\t\treturn jQuery.slugify( string, { separator: '_' } )\r\n\t\t}\r\n\t});\r\n\r\n\treturn controller;\r\n} );\r\n\n","/**\r\n * Creates notices for our fields domain.\r\n * \r\n * @package Ninja Forms builder\r\n * @subpackage Fields\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'controllers/fields/notices',[], function() {\r\n\tvar controller = Marionette.Object.extend( {\r\n\t\tinitialize: function() {\r\n\t\t\tthis.listenTo( nfRadio.channel( 'fields' ), 'add:stagedField', this.addStagedField );\r\n\t\t},\r\n\r\n\t\taddStagedField: function( model ) {\r\n\t\t\tnfRadio.channel( 'notices' ).request( 'add', 'addStagedField', model.get( 'nicename' ) + ' added to staging' );\r\n\t\t}\r\n\t});\r\n\r\n\treturn controller;\r\n} );\n","/**\r\n * Handles mobile-specific JS for our fields domain.\r\n * \r\n * @package Ninja Forms builder\r\n * @subpackage Fields\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'controllers/fields/mobile',[], function() {\r\n\tvar controller = Marionette.Object.extend( {\r\n\t\tinitialize: function() {\r\n\t\t\t// Listen for the start of our sorting.\r\n\t\t\t// this.listenTo( nfRadio.channel( 'app' ), 'render:fieldsSortable', this.initWiggle );\r\n\t\t\t// Listen for when we start sorting.\r\n\t\t\tthis.listenTo( nfRadio.channel( 'fields' ), 'sortable:start', this.startWiggle );\r\n\t\t\t// Listen for when we stop sorting.\r\n\t\t\tthis.listenTo( nfRadio.channel( 'fields' ), 'sortable:stop', this.stopWiggle );\r\n\t\t},\r\n\r\n\t\tinitWiggle: function( view ) {\r\n\t\t\tif ( nfRadio.channel( 'app' ).request( 'is:mobile' ) ) {\r\n\t\t\t\tjQuery( view.el ).find( '.nf-field-wrap' ).on( 'taphold', function() {\r\n\t\t\t\t\tjQuery( this ).ClassyWiggle( 'start', { degrees: ['.65', '1', '.65', '0', '-.65', '-1', '-.65', '0'], delay: 50 } );\r\n\t\t\t\t} );\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\tstartWiggle: function( ui ) {\r\n\t\t\tif ( nfRadio.channel( 'app' ).request( 'is:mobile' ) ) {\r\n\t\t\t\tjQuery( ui.item ).removeClass( 'ui-sortable-helper' ).ClassyWiggle( 'stop' );\r\n\t\t\t\tjQuery( ui.helper ).css( 'opacity', '0.75' ).ClassyWiggle( 'start', { degrees: ['.5', '1', '.5', '0', '-.5', '-1', '-.5', '0'] } );\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\tstopWiggle: function( ui ) {\r\n\t\t\tif ( nfRadio.channel( 'app' ).request( 'is:mobile' ) ) {\r\n\t\t\t\tjQuery( ui.helper ).ClassyWiggle( 'stop' );\r\n\t\t\t\tjQuery( ui.item ).removeClass( 'ui-sortable-helper drag-selected' );\r\n\t\t\t}\r\n\t\t}\r\n\t});\r\n\r\n\treturn controller;\r\n} );\r\n\n","/**\r\n * If we add a saved field to our form and then update it, set the \"saved\" flag to false.\r\n * \r\n * @package Ninja Forms builder\r\n * @subpackage Fields\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'controllers/fields/savedFields',[], function() {\r\n\tvar controller = Marionette.Object.extend( {\r\n\t\tignoreAttributes: [\r\n\t\t\t'editActive',\r\n\t\t\t'order',\r\n\t\t\t'saved',\r\n\t\t\t'jBox'\r\n\t\t],\r\n\r\n\t\tinitialize: function() {\r\n\t\t\tthis.listenTo( nfRadio.channel( 'fields' ), 'update:setting', this.updateField );\r\n\t\t\t// Listen to clicks on our add saved field button.\r\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer' ), 'click:addSavedField', this.clickAddSavedField, this );\r\n\t\t},\r\n\r\n\t\tupdateField: function( dataModel ) {\r\n\t\t\tif ( dataModel.get( 'saved' ) ) {\r\n\t\t\t\t\r\n\t\t\t\tvar modified = false;\r\n\t\t\t\tvar changedAttributes = _.keys( dataModel.changedAttributes() );\r\n\t\t\t\tvar that = this;\r\n\t\t\t\t_.each( changedAttributes, function( changed ) {\r\n\t\t\t\t\tif ( -1 == that.ignoreAttributes.indexOf( changed ) ) {\r\n\t\t\t\t\t\tmodified = true;\r\n\t\t\t\t\t}\r\n\t\t\t\t} );\r\n\t\t\t\t\r\n\t\t\t\tif ( modified ) {\r\n\t\t\t\t\tdataModel.set( 'saved', false );\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\tclickAddSavedField: function( e, dataModel ) {\r\n\t\t\tvar modelClone = nfRadio.channel( 'app' ).request( 'clone:modelDeep', dataModel );\r\n\r\n\t\t\tvar fieldData = modelClone.attributes;\r\n\t\t\tfieldData.saved = true;\r\n\r\n\t\t\tdelete fieldData.jBox;\r\n\t\t\tdelete fieldData.editActive;\r\n\t\t\tdelete fieldData.created_at;\r\n\t\t\tdelete fieldData.order;\r\n\t\t\tdelete fieldData.id;\r\n\t\t\tdelete fieldData.formID;\r\n\t\t\tdelete fieldData.parent_id;\r\n\t\t\t\r\n\t\t\tvar type = nfRadio.channel( 'fields' ).request( 'get:type', fieldData.type );\r\n\t\t\tvar newType = _.clone( type.attributes );\r\n\r\n\t\t\tvar nicename = jQuery( e.target ).parent().parent().find( 'input' ).val();\r\n\t\t\tconsole.log( nicename );\r\n\t\t\tnewType.nicename = nicename;\r\n\t\t\tfieldData.label = nicename;\r\n\t\t\tfieldData.nicename = nicename;\r\n\t\t\tdataModel.set( 'addSavedLoading', true );\r\n\t\t\tvar newTypeDefaults = JSON.stringify( fieldData );\r\n\r\n\t\t\tjQuery.post( ajaxurl, { action: 'nf_create_saved_field', field: newTypeDefaults, security: nfAdmin.ajaxNonce }, function( response ) {\r\n\t\t\t\tresponse = JSON.parse( response );\r\n\t\t\t\tnewType.id = response.data.id;\r\n\t\t\t\tnewType.nicename = nicename;\r\n\t\t\t\tnewType.settingDefaults = fieldData;\r\n\r\n\t\t\t\tvar typeCollection = nfRadio.channel( 'fields' ).request( 'get:typeCollection' );\r\n\t\t\t\tvar newModel = typeCollection.add( newType );\r\n\r\n\t\t\t\tvar typeSections = nfRadio.channel( 'fields' ).request( 'get:typeSections' );\r\n\t\t\t\ttypeSections.get( 'saved' ).get( 'fieldTypes' ).push( newType.id );\r\n\r\n\t\t\t\t// dataModel.set( 'type', response.data.id );\r\n\t\t\t\tdataModel.set( 'addSavedLoading', false );\r\n\t\t\t\tdataModel.unset( 'addSavedLoading', { silent: true } );\r\n\t\t\t\tdataModel.get( 'jBox' ).close();\r\n\t\t\t\t// dataModel.set( 'saved', true );\r\n\r\n\t\t\t\tnfRadio.channel( 'notices' ).request( 'add', 'addSaved', 'Saved Field Added' );\r\n\t\t\t} );\r\n\t\t}\r\n\t});\r\n\r\n\treturn controller;\r\n} );\n","/**\r\n * Listens to our app channel for settings views being rendered.\r\n *\r\n * If we're rendering a datepicker setting, add our datepicker.\r\n * \r\n * @package Ninja Forms builder\r\n * @subpackage Main App\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'controllers/fields/fieldDatepicker',[], function() {\r\n\tvar controller = Marionette.Object.extend( {\r\n\t\tinitialize: function() {\r\n\t\t\tthis.listenTo( nfRadio.channel( 'setting-type-datepicker' ), 'render:setting', this.addDatepicker );\r\n\t\t},\r\n\r\n\t\taddDatepicker: function( settingModel, dataModel, view ) {\r\n\t\t\tvar dateObject = pikadayResponsive( jQuery( view.el ).find( '.setting' )[0] );\t\t\t\r\n\t\t}\r\n\t});\r\n\r\n\treturn controller;\r\n} );\n","/**\r\n * Listens to our app channel for settings views being rendered.\r\n *\r\n * If we're rendering a product_assignment setting, add our products to the data model.\r\n * \r\n * @package Ninja Forms builder\r\n * @subpackage Main App\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'controllers/fields/fieldDisplayCalc',[], function() {\r\n\tvar controller = Marionette.Object.extend( {\r\n\t\tinitialize: function() {\r\n\t\t\t// Listen for messages that are fired before a setting view is rendered.\r\n\t\t\tthis.listenTo( nfRadio.channel( 'setting-calc_var' ), 'before:renderSetting', this.beforeRenderSetting );\r\n\t\t},\r\n\r\n\t\tbeforeRenderSetting: function( settingModel, dataModel, view ) {\r\n\t\t\t// console.log( 'render!' );\r\n\t\t},\r\n\r\n\t\tgetProductFields: function( settingModel ) {\r\n\t\t\tvar productFields = [ settingModel.get( 'select_product' ) ];\r\n\t\t\t// Update our dataModel with all of our product fields.\r\n\t\t\tvar fields = nfRadio.channel( 'fields' ).request( 'get:collection' );\r\n\t\t\t_.each( fields.models, function( field ) {\r\n\t\t\t\tif ( 'product' == field.get( 'type' ) ) {\r\n\t\t\t\t\tproductFields.push( { label: field.get( 'label' ), value: field.get( 'id' ) } );\r\n\t\t\t\t}\r\n\t\t\t} );\r\n\t\t\treturn productFields;\r\n\t\t}\r\n\r\n\t});\r\n\r\n\treturn controller;\r\n} );\n","/**\r\n * Creates and stores a collection of action types. This includes all of the settings shown when editing a field.\r\n *\r\n * Loops over our preloaded data and adds that to our action type collection\r\n *\r\n * Also responds to requests for data about action types\r\n *\r\n * @package Ninja Forms builder\r\n * @subpackage Actions\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'controllers/actions/types',[ 'models/app/typeCollection' ], function( TypeCollection ) {\r\n\tvar controller = Marionette.Object.extend( {\r\n\t\tinitialize: function() {\r\n\r\n\t\t\t/*\r\n\t\t\t * Instantiate \"installed\" actions collection.\r\n\t\t\t */\r\n\t\t\tthis.installedActions = new TypeCollection(\r\n\t\t\t\t_.filter( actionTypeData, function( type ) {\r\n\t\t\t\t\treturn type.section == 'installed';\r\n\t\t\t\t\t} \r\n\t\t\t\t),\r\n\t\t\t\t{\r\n\t\t\t\t\tslug: 'installed',\r\n\t\t\t\t\tnicename: nfi18n.installed\r\n\t\t\t\t} \r\n\t\t\t);\r\n\r\n\t\t\tthis.availableActions = new TypeCollection(\r\n\t\t\t\t_.filter( actionTypeData, function( type ) {\r\n\t\t\t\t\treturn type.section == 'available';\r\n\t\t\t\t\t} \r\n\t\t\t\t),\r\n\t\t\t\t{\r\n\t\t\t\t\tslug: 'available',\r\n\t\t\t\t\tnicename: nfi18n.available\r\n\t\t\t\t}\r\n\t\t\t);\r\n\r\n\t\t\t// Respond to requests to get field type, collection, settings, and sections\r\n\t\t\tnfRadio.channel( 'actions' ).reply( 'get:type', this.getType, this );\r\n\t\t\tnfRadio.channel( 'actions' ).reply( 'get:installedActions', this.getInstalledActions, this );\r\n\t\t\tnfRadio.channel( 'actions' ).reply( 'get:availableActions', this.getAvailableActions, this );\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Return a field type by id\r\n\t\t *\r\n\t\t * @since  3.0\r\n\t\t * @param  string \t\t\tid \tfield type\r\n\t\t * @return backbone.model    \tfield type model\r\n\t\t */\r\n\t\tgetType: function( id ) {\r\n\t\t\t// Search our installed actions first\r\n\t\t\tvar type = this.installedActions.get( id );\r\n\t\t\tif ( ! type ) {\r\n\t\t\t\ttype = this.availableActions.get( id );\r\n\t\t\t}\r\n        \treturn type;\r\n        },\r\n\r\n        /**\r\n         * Return the installed action type collection\r\n         *\r\n         * @since  3.0\r\n         * @return backbone.collection    \tfield type collection\r\n         */\r\n\t\tgetInstalledActions: function() {\r\n        \treturn this.installedActions;\r\n        },\r\n\r\n        /**\r\n         * Return the available action type collection\r\n         *\r\n         * @since  3.0\r\n         * @return backbone.collection    \tfield type collection\r\n         */\r\n\t\tgetAvailableActions: function() {\r\n        \treturn this.availableActions;\r\n        },\r\n\r\n        /**\r\n         * Add a field type to our staging area when the field type button is clicked.\r\n         *\r\n         * @since 3.0\r\n         * @param Object e event\r\n         * @return void\r\n         */\r\n        addStagedField: function( e ) {\r\n        \tvar type = jQuery( e.target ).data( 'id' );\r\n        \tnfRadio.channel( 'fields' ).request( 'add:stagedField', type );\r\n        },\r\n\r\n        /**\r\n         * Return our field type settings sections\r\n         *\r\n         * @since  3.0\r\n         * @return backbone.collection field type settings sections\r\n         */\r\n        getTypeSections: function() {\r\n            return this.fieldTypeSections;\r\n        }\r\n\t});\r\n\r\n\treturn controller;\r\n} );\r\n\n","/**\r\n * Model that represents our form action.\r\n * \r\n * @package Ninja Forms builder\r\n * @subpackage Actions\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'models/actions/actionModel',[], function() {\r\n\tvar model = Backbone.Model.extend( {\r\n\t\tdefaults: {\r\n\t\t\tobjectType: 'Action',\r\n\t\t\tobjectDomain: 'actions',\r\n\t\t\teditActive: false\r\n\t\t},\r\n\r\n\t\tinitialize: function() {\r\n\t\t\t// Listen for model attribute changes\r\n\t\t\tthis.on( 'change', this.changeSetting, this );\r\n\r\n\t\t\t// Get our parent field type.\r\n\t\t\tvar actionType = nfRadio.channel( 'actions' ).request( 'get:type', this.get( 'type' ) );\r\n\r\n\t\t\tif( 'undefined' == typeof actionType ) return;\r\n\r\n\t\t\t// Loop through our action type \"settingDefaults\" and add any default settings.\r\n\t\t\tvar that = this;\r\n\t\t\t_.each( actionType.get( 'settingDefaults' ), function( val, key ) {\r\n\t\t\t\tif ( ! that.get( key ) ) {\r\n\t\t\t\t\tthat.set( key, val, { silent: true } );\r\n\t\t\t\t}\r\n\t\t\t} );\r\n\t\t\t\r\n\t\t\t/*\r\n\t\t\t * Trigger an init event on three channels:\r\n\t\t\t * \r\n\t\t\t * actions\r\n\t\t\t * action-type\r\n\t\t\t *\r\n\t\t\t * This lets specific field types modify model attributes before anything uses them.\r\n\t\t\t */ \r\n\t\t\tnfRadio.channel( 'actions' ).trigger( 'init:actionModel', this );\r\n\t\t\tnfRadio.channel( 'actions-' + this.get( 'type' ) ).trigger( 'init:actionModel', this );\r\n\r\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'fire:updateFieldKey', this.updateFieldKey );\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * When we change the model attributes, fire an event saying we've changed something.\r\n\t\t * \r\n\t\t * @since  3.0\r\n\t\t * @return void\r\n\t\t */\r\n\t\tchangeSetting: function( model, options ) {\r\n            nfRadio.channel( 'actionSetting-' + _.keys( this.changedAttributes() )[0] ).trigger( 'update:setting', this, options.settingModel ) ;\r\n\t\t\tnfRadio.channel( 'actions').trigger( 'update:setting', this, options.settingModel );\r\n            nfRadio.channel( 'app' ).trigger( 'update:setting', this, options.settingModel );\r\n\t\t},\r\n\r\n\t\tupdateFieldKey: function( keyModel, settingModel ) {\r\n\t\t\tnfRadio.channel( 'app' ).trigger( 'replace:fieldKey', this, keyModel, settingModel );\r\n\t\t}\r\n\t} );\r\n\t\r\n\treturn model;\r\n} );\n","/**\r\n * Collection that holds our action models. \r\n * This is the actual action data created by the user.\r\n *\r\n * We listen to the add and remove events so that we can push the new id to either the new action or removed action property.\r\n * \r\n * @package Ninja Forms builder\r\n * @subpackage Actions\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'models/actions/actionCollection',['models/actions/actionModel'], function( actionModel ) {\r\n\tvar collection = Backbone.Collection.extend( {\r\n\t\tmodel: actionModel,\r\n\t\tcomparator: 'order',\r\n\t\ttmpNum: 1,\r\n\r\n\t\tinitialize: function() {\r\n\t\t\tthis.on( 'add', this.addAction, this );\r\n\t\t\tthis.on( 'remove', this.removeAction, this );\r\n\t\t\tthis.newIDs = [];\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * When we add a field, push the id onto our new action property.\r\n\t\t * This lets us tell the server that this is a new field to be added rather than a field to be updated.\r\n\t\t * \r\n\t\t * @since 3.0\r\n\t\t * @param void\r\n\t\t */\r\n\t\taddAction: function( model ) {\r\n\t\t\tthis.newIDs.push( model.get( 'id' ) );\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * When we remove a field, push the id onto our removed action property.\r\n\t\t * \r\n\t\t * @since 3.0\r\n\t\t * @param void\r\n\t\t */\r\n\t\tremoveAction: function( model ) {\r\n\t\t\tthis.removedIDs[ model.get( 'id' ) ] = model.get( 'id' );\r\n\t\t}\r\n\t} );\r\n\treturn collection;\r\n} );\n","/**\r\n * Handles interactions with our actions collection.\r\n * \r\n * @package Ninja Forms builder\r\n * @subpackage Actions\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'controllers/actions/data',['models/actions/actionCollection', 'models/actions/actionModel'], function( actionCollection, actionModel ) {\r\n\tvar controller = Marionette.Object.extend( {\r\n\t\tinitialize: function() {\r\n\t\t\t// Load our action collection from our localized form data\r\n\t\t\tthis.collection = new actionCollection( preloadedFormData.actions );\r\n\t\t\tthis.collection.tmpNum = 1;\r\n\r\n\t\t\tif ( 0 != this.collection.models.length ) {\r\n\t\t\t\tvar that = this;\r\n\t\t\t\t_.each( this.collection.models, function( action ) {\r\n\t\t\t\t\tif ( ! jQuery.isNumeric( action.get( 'id' ) ) ) {\r\n\t\t\t\t\t\tthat.collection.tmpNum++;\r\n\t\t\t\t\t}\r\n\t\t\t\t} );\r\n\t\t\t}\r\n\t\t\t// Set our removedIDs to an empty object. This will be populated when a action is removed so that we can add it to our 'deleted_actions' object.\r\n\t\t\tthis.collection.removedIDs = {};\r\n\r\n\t\t\t// Respond to requests for data about actions and to update/change/delete actions from our collection.\r\n\t\t\tnfRadio.channel( 'actions' ).reply( 'get:collection', this.getCollection, this );\r\n\t\t\tnfRadio.channel( 'actions' ).reply( 'get:action', this.getAction, this );\r\n\t\t\tnfRadio.channel( 'actions' ).reply( 'get:tmpID', this.getTmpID, this );\r\n\r\n\t\t\tnfRadio.channel( 'actions' ).reply( 'add', this.addAction, this );\r\n\t\t\tnfRadio.channel( 'actions' ).reply( 'delete', this.deleteAction, this );\r\n\t\t},\r\n\r\n\t\tgetCollection: function() {\r\n\t\t\treturn this.collection;\r\n\t\t},\r\n\r\n\t\tgetAction: function( id ) {\r\n\t\t\treturn this.collection.get( id );\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Add a action to our collection. If silent is passed as true, no events will trigger.\r\n\t\t * \r\n\t\t * @since 3.0\r\n\t\t * @param Object \tdata \taction data to insert\r\n\t\t * @param bool \t\tsilent \tprevent events from firing as a result of adding\t \t\r\n\t\t */\r\n\t\taddAction: function( data, silent ) {\r\n\t\t\tsilent = silent || false;\r\n\r\n\t\t\tif ( false === data instanceof Backbone.Model ) {\r\n\t\t\t\tvar model = new actionModel( data );\r\n\t\t\t} else {\r\n\t\t\t\tvar model = data;\r\n\t\t\t}\r\n\r\n\t\t\tthis.collection.add( model, { silent: silent } );\r\n\t\t\t// Set our 'clean' status to false so that we get a notice to publish changes\r\n\t\t\tnfRadio.channel( 'app' ).request( 'update:setting', 'clean', false );\r\n\r\n\t\t\treturn model;\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Delete a action from our collection.\r\n\t\t * \r\n\t\t * @since  3.0\r\n\t\t * @param  backbone.model \tmodel \taction model to be deleted\r\n\t\t * @return void\r\n\t\t */\r\n\t\tdeleteAction: function( model ) {\r\n\t\t\tthis.collection.remove( model );\r\n\t\t\t// Set our 'clean' status to false so that we get a notice to publish changes\r\n\t\t\tnfRadio.channel( 'app' ).request( 'update:setting', 'clean', false );\r\n\t\t\tnfRadio.channel( 'app' ).request( 'update:db' );\r\n\r\n\t\t},\r\n\r\n\r\n\t\t/**\r\n\t\t * Return a new tmp id for our actions.\r\n\t\t * Gets the action collection length, adds 1, then returns that prepended with 'tmp-'.\r\n\t\t * \r\n\t\t * @since  3.0\r\n\t\t * @return string\r\n\t\t */\r\n\t\tgetTmpID: function() {\r\n\t\t\tvar tmpNum = this.collection.tmpNum;\r\n\t\t\tthis.collection.tmpNum++;\r\n\t\t\treturn 'tmp-' + tmpNum;\r\n\t\t}\r\n\t});\r\n\r\n\treturn controller;\r\n} );\n","/**\r\n * Fetches settings models so that we can get setting information\r\n * \r\n * @package Ninja Forms builder\r\n * @subpackage Main App\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'controllers/actions/actionSettings',['models/app/settingCollection'], function( settingCollection ) {\r\n\tvar controller = Marionette.Object.extend( {\r\n\t\tinitialize: function() {\r\n\t\t\tthis.collection = new settingCollection( actionSettings, { objectType: 'actions' } );\r\n\r\n\t\t\t// Responds to requests for settings models.\r\n\t\t\tnfRadio.channel( 'actions' ).reply( 'get:settingModel', this.getSettingModel, this );\r\n\t\t},\r\n\r\n\t\tgetSettingModel: function( name ) {\r\n\t\t\treturn this.collection.findWhere( { name: name } );\r\n\t\t}\r\n\r\n\t});\r\n\r\n\treturn controller;\r\n} );\n","/**\r\n * Handles adding and removing the active class from a action currently being edited.\r\n * \r\n * @package Ninja Forms builder\r\n * @subpackage Actions - Edit Action Drawer\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'controllers/actions/editActive',[], function() {\r\n\tvar controller = Marionette.Object.extend( {\r\n\t\tinitialize: function() {\r\n\t\t\t// Respond to requests to remove the active class from all our actions.\r\n\t\t\tnfRadio.channel( 'actions' ).reply( 'clear:editActive', this.clearEditActive, this );\r\n\t\t\t// Listen for the closing drawer so that we can remove all of our active classes.\r\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer-editSettings' ), 'before:closeDrawer', this.clearEditActive );\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Loops through our actions collection and sets editActive to false.\r\n\t\t * \r\n\t\t * @since  3.0\r\n\t\t * @return void\r\n\t\t */\r\n        clearEditActive: function() {\r\n            var actionCollection = nfRadio.channel( 'actions' ).request( 'get:collection' );\r\n            _.each( actionCollection.models, function( action ) {\r\n\t\t\t\taction.set( 'editActive', false );\r\n            } );\r\n        }\r\n\t});\r\n\r\n\treturn controller;\r\n} );\r\n\n","/**\r\n * @package Ninja Forms builder\r\n * @subpackage Actions - Action Settings Drawer\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'controllers/actions/emailFromSetting',[], function( ) {\r\n    var controller = Marionette.Object.extend( {\r\n        initialize: function() {\r\n            this.listenTo( nfRadio.channel( 'actionSetting-from_address' ), 'update:setting', this.updateFromAddress );\r\n        },\r\n\r\n        updateFromAddress: function( dataModel, settingModel ) {\r\n            if( 'undefined' == typeof settingModel ) return;\r\n\r\n            var value = dataModel.get( 'from_address' ).trim();\r\n\r\n            if( '{wp:admin_email}' == value ) {\r\n                return settingModel.set( 'warning', false );\r\n            }\r\n\r\n            if( value && ( ! this.isValidEmail( value ) ) || nfAdmin.home_url_host != value.replace(/.*@/, \"\") ){\r\n                return settingModel.set( 'warning', nfi18n.errorInvalidEmailFromAddress );\r\n            }\r\n\r\n            return settingModel.set( 'warning', false );\r\n        },\r\n\r\n        isValidEmail: function(email) {\r\n            return /^.+@.+\\..+$/.test(email);\r\n        }\r\n    });\r\n    return controller;\r\n} );\n","/**\r\n * Handles clicks and dragging for our action types.\r\n * \r\n * @package Ninja Forms builder\r\n * @subpackage Fields - New Field Drawer\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'controllers/actions/addActionTypes',['models/actions/actionCollection', 'models/actions/actionModel'], function( actionCollection, actionModel ) {\r\n\tvar controller = Marionette.Object.extend( {\r\n\t\tinitialize: function() {\r\n\t\t\tthis.listenTo( nfRadio.channel( 'actions' ), 'click:addAction', this.addAction );\r\n\r\n\t\t\tnfRadio.channel( 'actions' ).reply( 'add:actionType', this.addAction, this );\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Add an action to our collection. If silent is passed as true, no events will trigger.\r\n\t\t * \r\n\t\t * @since 3.0\r\n\t\t * @param Object \tdata \taction data to insert\r\n\t\t * @param bool \t\tsilent \tprevent events from firing as a result of adding\t \t\r\n\t\t */\r\n\t\taddAction: function( type ) {\r\n\r\n\t\t\tvar data = {\r\n\t\t\t\tid: nfRadio.channel( 'actions' ).request( 'get:tmpID' ),\r\n\t\t\t\ttype: type.get( 'id' ),\r\n\t\t\t\tlabel: type.get( 'settingDefaults').label || type.get( 'nicename' )\r\n\t\t\t}\r\n\r\n\t\t\tvar newModel = nfRadio.channel( 'actions' ).request( 'add', data );\r\n\r\n\t\t\tvar label = {\r\n\t\t\t\tobject: 'Action',\r\n\t\t\t\tlabel: newModel.get( 'label' ),\r\n\t\t\t\tchange: 'Added',\r\n\t\t\t\tdashicon: 'plus-alt'\r\n\t\t\t};\r\n\r\n\t\t\tvar data = {\r\n\t\t\t\tcollection: nfRadio.channel( 'actions' ).request( 'get:collection' )\r\n\t\t\t}\r\n\r\n\t\t\tnfRadio.channel( 'changes' ).request( 'register:change', 'addObject', newModel, null, label, data );\r\n\t\t\tnfRadio.channel( 'app' ).trigger( 'click:edit', {}, newModel );\r\n\t\t}\r\n\t});\r\n\r\n\treturn controller;\r\n} );\n","/**\r\n * Handles the logic for our action type draggables.\r\n * \r\n * @package Ninja Forms builder\r\n * @subpackage Actions - New Action Drawer\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'controllers/actions/typeDrag',[], function( ) {\r\n\tvar controller = Marionette.Object.extend( {\r\n\t\tinitialize: function() {\r\n\t\t\t// Listen to our action type draggables and run the appropriate function.\r\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer-addAction' ), 'startDrag:type', this.startDrag );\r\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer-addAction' ), 'stopDrag:type', this.stopDrag );\r\n\t\t\t/*\r\n\t\t\t * Respond to requests for our helper clone.\r\n\t\t\t * This is used by other parts of the application to modify what the user is dragging in real-time.\r\n\t\t\t */ \r\n\t\t\tnfRadio.channel( 'drawer-addAction' ).reply( 'get:typeHelperClone', this.getCurrentDraggableHelperClone, this );\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * When we start dragging:\r\n\t\t * get our drawer element\r\n\t\t * set its overflow property to visible !important -> forces the type drag element to be on at the top of the z-index.\r\n\t\t * get our main element\r\n\t\t * est its overflow propery to visible !important -> forces the type drag element to be on top of the z-index.\r\n\t\t * set our dragging helper clone\r\n\t\t * \r\n\t\t * @since  3.0\r\n\t\t * @param  object context \tThis function is going to be called from a draggable. Context is the \"this\" reference to the draggable.\r\n\t\t * @param  object ui      \tObject sent by jQuery UI draggable.\r\n\t\t * @return void\r\n\t\t */\r\n\t\tstartDrag: function( context, ui ) {\r\n\t\t\tthis.drawerEl = nfRadio.channel( 'app' ).request( 'get:drawerEl' );\r\n\t\t\tthis.mainEl = nfRadio.channel( 'app' ).request( 'get:mainEl' );\r\n\t\t\tjQuery( this.drawerEl )[0].style.setProperty( 'overflow', 'visible', 'important' );\r\n\t\t\t// jQuery( this.mainEl )[0].style.setProperty( 'overflow', 'visible', 'important' );\r\n\r\n\t\t\tthis.draggableHelperClone = jQuery( ui.helper ).clone();\r\n\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * When we stop dragging, reset our overflow property to hidden !important.\r\n\t\t * \r\n\t\t * @since  3.0\r\n\t\t * @param  object context \tThis function is going to be called from a draggable. Context is the \"this\" reference to the draggable.\r\n\t\t * @param  object ui      \tObject sent by jQuery UI draggable.\r\n\t\t * @return {[type]}         [description]\r\n\t\t */\r\n\t\tstopDrag: function( context, ui ) {\r\n\t\t\tjQuery( this.drawerEl )[0].style.setProperty( 'overflow', 'hidden', 'important' );\r\n\t\t\t// jQuery( this.mainEl )[0].style.setProperty( 'overflow', 'hidden', 'important' );\r\n\t\t},\r\n\r\n\t\tgetCurrentDraggableHelperClone: function() {\r\n\t\t\treturn this.draggableHelperClone;\r\n\t\t}\r\n\t});\r\n\r\n\treturn controller;\r\n} );\n","/**\r\n * Handles the logic for our action type droppable.\r\n * \r\n * @package Ninja Forms builder\r\n * @subpackage Actions - New Action Drawer\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'controllers/actions/droppable',[], function( ) {\r\n\tvar controller = Marionette.Object.extend( {\r\n\t\tinitialize: function() {\r\n\t\t\t/*\r\n\t\t\t * Respond to requests for our helper clone.\r\n\t\t\t * This is used by other parts of the application to modify what the user is dragging in real-time.\r\n\t\t\t */ \r\n\t\t\tnfRadio.channel( 'app' ).reply( 'drop:actionType', this.dropActionType, this );\r\n\t\t},\r\n\r\n\t\tdropActionType: function( e, ui ) {\r\n\t\t\tvar type_slug = jQuery( ui.helper ).data( 'type' );\r\n\t\t\tvar type = nfRadio.channel( 'actions' ).request( 'get:type', type_slug );\r\n\t\t\tnfRadio.channel( 'actions' ).request( 'add:actionType', type );\r\n\t\t}\r\n\t});\r\n\r\n\treturn controller;\r\n} );\n","/**\r\n * Model for our action type\r\n * \r\n * @package Ninja Forms builder\r\n * @subpackage Actions\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'models/actions/typeModel',[], function() {\r\n\tvar model = Backbone.Model.extend( {\r\n\r\n\t} );\r\n\t\r\n\treturn model;\r\n} );\n","/**\r\n * Collection that holds our action type models. \r\n * \r\n * @package Ninja Forms builder\r\n * @subpackage Actions\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'models/actions/typeCollection',['models/actions/typeModel'], function( actionTypeModel ) {\r\n\tvar collection = Backbone.Collection.extend( {\r\n\t\tmodel: actionTypeModel\r\n\t} );\r\n\treturn collection;\r\n} );\n","/**\r\n * Filters our action type collection.\r\n * \r\n * @package Ninja Forms builder\r\n * @subpackage Actions - New Action Drawer\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'controllers/actions/filterTypes',['models/actions/typeCollection'], function( typeCollection ) {\r\n\tvar controller = Marionette.Object.extend( {\r\n\t\tinitialize: function() {\r\n\t\t\t// Listen to our change filter event.\r\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer-addAction' ), 'change:filter', this.filterActionTypes );\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Filter our action types in the add new action drawer\r\n\t\t * \r\n\t\t * Takes a search string and finds any action types that match either the name or alias.\r\n\t\t * \r\n\t\t * @since  3.0\r\n\t\t * @param  string\t search \tstring being searched for\r\n\t\t * @param  object \t e      \tKeyup event\r\n\t\t * @return void\r\n\t\t */\r\n\t\tfilterActionTypes: function( search, e ) {\r\n\r\n\t\t\t// Make sure that we aren't dealing with an empty string.\r\n\t\t\tif ( '' != jQuery.trim( search ) ) {\r\n\r\n        \t\tvar filteredInstalled = [];\r\n        \t\t/**\r\n        \t\t * Call the function that actually filters our collection,\r\n        \t\t * and then loop through our collection, adding each model to our filteredInstalled array.\r\n        \t\t */\r\n\t\t\t\tvar installedActions = nfRadio.channel( 'actions' ).request( 'get:installedActions' );\r\n        \t\t_.each( this.filterCollection( search, installedActions ), function( model ) {\r\n        \t\t\tfilteredInstalled.push( model );\r\n        \t\t} );\r\n\r\n        \t\tvar filteredAvailable = [];\r\n        \t\tvar availableActions = nfRadio.channel( 'actions' ).request( 'get:availableActions' );\r\n        \t\t_.each( this.filterCollection( search, availableActions ), function( model ) {\r\n        \t\t\tfilteredAvailable.push( model );\r\n        \t\t} );\r\n\r\n        \t\t// Create a new Action Type Section collection with the filtered array.\r\n        \t\tvar newInstalled = new typeCollection( filteredInstalled );\r\n        \t\tnewInstalled.slug = 'installed';\r\n        \t\tnewInstalled.nicename = 'Installed';\r\n\r\n        \t\tvar newAvailable = new typeCollection( filteredAvailable );\r\n        \t\tnewAvailable.slug = 'available';\r\n        \t\tnewAvailable.nicename = 'Available';\r\n\r\n        \t\t// Request that our action types filter be applied, passing the collection we created above.\r\n        \t\tnfRadio.channel( 'drawer' ).trigger( 'filter:actionTypes', newInstalled, newAvailable );\r\n        \t\t// If we've pressed the 'enter' key, add the action to staging and clear the filter.\r\n        \t\tif ( e.addObject ) {\r\n        \t\t\tif ( 0 < newInstalled.length ) {\r\n        \t\t\t\tnfRadio.channel( 'actions' ).request( 'add:actionType', newInstalled.models[0] );\r\n        \t\t\t\tnfRadio.channel( 'drawer' ).request( 'clear:filter' );\r\n        \t\t\t}\r\n        \t\t}\r\n        \t} else {\r\n        \t\t// Clear our filter if the search text is empty.\r\n        \t\tnfRadio.channel( 'drawer' ).trigger( 'clear:filter' );\r\n        \t}\r\n        },\r\n\r\n        /**\r\n         * Search our action type collection for the search string.\r\n         * \r\n         * @since  3.0\r\n         * @param  string\t search \tstring being searched for\r\n         * @return backbone.collection\r\n         */\r\n        filterCollection: function( search, collection ) {\r\n        \tsearch = search.toLowerCase();\r\n        \t/*\r\n        \t * Backbone collections have a 'filter' method that loops through every model,\r\n        \t * waiting for you to return true or false. If you return true, the model is kept.\r\n        \t * If you return false, it's removed from the filtered result.\r\n        \t */\r\n\t\t\tvar filtered = collection.filter( function( model ) {\r\n\t\t\t\tvar found = false;\r\n\t\t\t\t\r\n\t\t\t\t// If we match either the ID or nicename, return true.\r\n\t\t\t\tif ( model.get( 'id' ).toLowerCase().indexOf( search ) != -1 ) {\r\n\t\t\t\t\tfound = true;\r\n\t\t\t\t} else if ( model.get( 'nicename' ).toLowerCase().indexOf( search ) != -1 ) {\r\n\t\t\t\t\tfound = true;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t/*\r\n\t\t\t\t * TODO: Hashtag searching. Doesn't really do anything atm.\r\n\t\t\t\t */\r\n\t\t\t\tif ( model.get( 'tags' ) && 0 == search.indexOf( '#' ) ) {\r\n\t\t\t\t\t_.each( model.get( 'tags' ), function( tag ) {\r\n\t\t\t\t\t\tif ( search.replace( '#', '' ).length > 1 ) {\r\n\t\t\t\t\t\t\tif ( tag.toLowerCase().indexOf( search.replace( '#', '' ) ) != -1 ) {\r\n\t\t\t\t\t\t\t\tfound = true;\r\n\t\t\t\t\t\t\t}\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t} );\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// If we match any of the aliases, return true.\r\n\t\t\t\tif ( model.get( 'alias' ) ) {\r\n\t\t\t\t\t_.each( model.get( 'alias' ), function( alias ) {\r\n\t\t\t\t\t\tif ( alias.toLowerCase().indexOf( search ) != -1 ) {\r\n\t\t\t\t\t\t\tfound = true;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t} );\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn found;\r\n\t\t\t} );\r\n\r\n\t\t\t// Return our filtered collection.\r\n\t\t\treturn filtered;\r\n        }\r\n\t});\r\n\r\n\treturn controller;\r\n} );\n","/**\r\n * @package Ninja Forms builder\r\n * @subpackage Actions - New Action Drawer\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'controllers/actions/newsletterList',[], function( ) {\r\n    var controller = Marionette.Object.extend( {\r\n        initialize: function() {\r\n            this.listenTo( nfRadio.channel( 'setting-newsletter_list' ),             'show:setting',      this.defaultFields );\r\n            this.listenTo( nfRadio.channel( 'setting-type-newsletter_list' ),        'click:extra',       this.clickListUpdate );\r\n            this.listenTo( nfRadio.channel( 'actionSetting-newsletter_list' ),       'update:setting',    this.maybeRenderFields );\r\n            this.listenTo( nfRadio.channel( 'actionSetting-newsletter_list' ),       'update:setting',    this.maybeRenderGroups );\r\n            this.listenTo( nfRadio.channel( 'setting-name-newsletter_list_fields' ), 'init:settingModel', this.registerFieldsListener );\r\n            this.listenTo( nfRadio.channel( 'setting-name-newsletter_list_groups' ), 'init:settingModel', this.registerGroupsListener );\r\n        },\r\n\r\n        defaultFields: function( settingModel, dataModel ) {\r\n            this.maybeRenderFields( dataModel, settingModel );\r\n            this.maybeRenderGroups( dataModel, settingModel );\r\n        },\r\n\r\n        registerFieldsListener: function ( model ) {\r\n            model.listenTo( nfRadio.channel( 'newsletter_list_fields' ), 'update:fieldMapping', this.updateFieldMapping, model );\r\n        },\r\n\r\n        registerGroupsListener: function ( model ) {\r\n            model.listenTo( nfRadio.channel( 'newsletter_list_groups' ), 'update:interestGroups', this.updateInterestGroups, model );\r\n        },\r\n\r\n        clickListUpdate: function( e, settingModel, dataModel, settingView ) {\r\n\r\n            var data = {\r\n                action: 'nf_' + dataModel.attributes.type + '_get_lists',\r\n                security: nfAdmin.ajaxNonce\r\n            };\r\n\r\n            var that = this;\r\n            jQuery( e.srcElement ).addClass( 'spin' );\r\n            jQuery.post( ajaxurl, data, function( response ){\r\n                var response = JSON.parse( response );\r\n                that.updateLists( settingModel, response.lists, settingView, dataModel );\r\n                dataModel.set( 'newsletter_list', response.lists[0].value, { settingModel: settingModel } );\r\n            }).always( function() {\r\n                jQuery( e.srcElement ).removeClass( 'spin' );\r\n            });\r\n        },\r\n\r\n        updateLists: function( settingModel, lists, settingView, dataModel ) {\r\n            settingModel.set( 'options', lists );\r\n            settingView.render();\r\n        },\r\n\r\n        maybeRenderFields: function( dataModel, settingModel ) {\r\n\r\n            if( 'undefined' == typeof settingModel ) return;\r\n\r\n            var selectedList = dataModel.get( 'newsletter_list' );\r\n            var lists = settingModel.get( 'options' );\r\n            _.each( lists, function( list ) {\r\n                if ( selectedList == list.value ) {\r\n                    nfRadio.channel( 'newsletter_list_fields').trigger( 'update:fieldMapping', list.fields );\r\n                }\r\n            } );\r\n\r\n            dataModel.set( 'newsletter_list_fields', 0 );\r\n        },\r\n\r\n        maybeRenderGroups: function( dataModel, settingModel ) {\r\n            if( 'undefined' == typeof settingModel ) return;\r\n\r\n            var selectedList = dataModel.get( 'newsletter_list' );\r\n            var lists = settingModel.get( 'options' );\r\n            _.each( lists, function( list ) {\r\n                if ( selectedList == list.value ) {\r\n                    nfRadio.channel( 'newsletter_list_groups').trigger( 'update:interestGroups', list.groups );\r\n                }\r\n            } );\r\n\r\n            dataModel.set( 'newsletter_list_fields', 0 );\r\n        },\r\n\r\n        updateFieldMapping: function( fields ) {\r\n           var settings = this.get( 'settings' );\r\n            settings.reset();\r\n            _.each( fields, function( field ){\r\n\r\n                settings.add({\r\n                    name: field.value,\r\n                    type: 'textbox',\r\n                    label: field.label,\r\n                    width: 'full',\r\n                    use_merge_tags: { exclude: [ 'user', 'post', 'system', 'querystrings' ] }\r\n                });\r\n            });\r\n            this.set( 'settings', settings );\r\n        },\r\n\r\n        updateInterestGroups: function( groups ) {\r\n            var settings = this.get( 'settings' );\r\n            settings.reset();\r\n            _.each( groups, function( group ){\r\n\r\n                settings.add({\r\n                    name: group.value,\r\n                    type: 'toggle',\r\n                    label: group.label,\r\n                    width: 'full',\r\n                });\r\n            });\r\n            this.set( 'settings', settings );\r\n        },\r\n\r\n    });\r\n\r\n    return controller;\r\n} );\r\n\n","/**\r\n * Listens to field deletion, removing any merge tags that reference the field.\r\n * \r\n * @package Ninja Forms builder\r\n * @subpackage Main App\r\n * @copyright (c) 2017 WP Ninjas\r\n * @since 3.1.7\r\n */\r\ndefine( 'controllers/actions/deleteFieldListener',[], function() {\r\n\tvar controller = Marionette.Object.extend( {\r\n\t\tinitialize: function() {\r\n\t\t\t/*\r\n\t\t\t * When we init an action model, register a listener for field deletion.\r\n\t\t\t */\r\n\t\t\tthis.listenTo( nfRadio.channel( 'actions' ), 'init:actionModel', this.registerListener );\r\n\t\t},\r\n\r\n\t\tregisterListener: function( actionModel ) {\r\n\t\t\tactionModel.listenTo( nfRadio.channel( 'fields' ), 'delete:field', this.maybeUpdateSettings );\r\n\t\t},\r\n\r\n\t\tmaybeUpdateSettings: function( fieldModel ) {\r\n\t\t\tvar newObject, filteredCollection,\r\n\t\t\t\tfieldMergeTag = '{field:' + fieldModel.get( 'key' ) + '}';\r\n\t\t\t\r\n\t\t\t/*\r\n\t\t\t * Loop through our action attributes to see if the field mergetag exists in our action.\r\n\t\t\t *\r\n\t\t\t * If it does:\r\n\t\t\t * \t- Replace the field mergetag in strings with ''.\r\n\t\t\t * \t- Remove any items with the field merge tag if they are in an array.\r\n\t\t\t */\r\n\t\t\t_.each( this.attributes, function( attr, key ) {\r\n\t\t\t\tif ( _.isString( attr ) ) {\r\n\t\t\t\t\t// If our attribute is a string, replace any instances of the field merge tag with an empty string.\r\n\t\t\t\t\tthis.set( key, attr.replace( fieldMergeTag, '' ) );\r\n\t\t\t\t} else if ( _.isArray( attr ) ) {\r\n\t\t\t\t\t// If our attribute is an array, search the contents for field merge tag and remove items that match.\r\n\t\t\t\t\t_.each( attr, function( val, index ) {\r\n\t\t\t\t\t\tif ( _.isString( val ) ) {\r\n\t\t\t\t\t\t\t// If val is a string, search it for the field mergetag.\r\n\t\t\t\t\t\t\tconsole.log( 'string replace' );\r\n\t\t\t\t\t\t} else if ( _.isArray( val ) ) {\r\n\t\t\t\t\t\t\t// If val is an array, search it for the field mergetag.\r\n\t\t\t\t\t\t\tconsole.log( 'array search' );\r\n\t\t\t\t\t\t} else if ( _.isObject( val ) ) {\r\n\t\t\t\t\t\t\t// If val is a object, search it for the field mergetag.\r\n\t\t\t\t\t\t\tnewObject = _.mapObject( val, function( value, key ) {\r\n\t\t\t\t\t\t\t\tif ( _.isString( value ) ) {\r\n\t\t\t\t\t\t\t\t\tif ( -1 != value.indexOf( fieldMergeTag ) ) {\r\n\t\t\t\t\t\t\t\t\t\tattr.splice( index, 1 );\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t};\r\n\r\n\t\t\t\t\t\t\t\treturn value;\r\n\t\t\t\t\t\t\t} );\r\n\r\n\t\t\t\t\t\t\tthis.set( key, attr );\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}, this );\r\n\t\t\t\t} else if ( attr instanceof Backbone.Collection ) {\r\n\t\t\t\t\t// This is a Backbone Collection, so we need to loop through the models and remove any that have an attribute containing the field merge tag.\r\n\t\t\t\t\tvar filteredCollection = attr.filter( function ( model ) {\r\n\t\t\t\t\t\t// Make sure that EVERY model attribute does NOT reference the field merge tag.\r\n\t\t\t\t\t    return _.every( model.attributes, function( val ) {\r\n\t\t\t\t\t    \t/*\r\n\t\t\t\t\t    \t * Currently only handles items that are one-level deep.\r\n\t\t\t\t\t    \t * TODO: Add support for further nesting of values.\r\n\t\t\t\t\t    \t */\r\n\t\t\t\t\t    \tif ( _.isString( val ) ) {\r\n\t\t\t\t\t    \t\tif ( -1 != val.indexOf( fieldMergeTag ) ) {\r\n\t\t\t\t\t    \t\t\treturn false;\r\n\t\t\t\t\t    \t\t}\r\n\t\t\t\t\t    \t}\r\n\t\t\t\t\t    \treturn true;\r\n\t\t\t\t\t    });;\r\n\t\t\t\t\t});\r\n\t\t\t\t\t// Update our key with the filtered collection value.\r\n\t\t\t\t\tthis.set( key, filteredCollection );\r\n\t\t\t\t}\r\n\t\t\t}, this );\r\n\t\t}\r\n\r\n\t});\r\n\r\n\treturn controller;\r\n} );\n","/**\r\n * Listens to our app channel for settings views being rendered.\r\n *\r\n * If we're rendering a collect payment setting, add our number fields and total fields to the data model.\r\n * \r\n * @package Ninja Forms builder\r\n * @subpackage Main App\r\n * @copyright (c) 2017 WP Ninjas\r\n * @since 3.1.7\r\n */\r\ndefine( 'controllers/actions/collectPaymentFields',[], function() {\r\n\tvar controller = Marionette.Object.extend( {\r\n\t\tinitialize: function() {\r\n\t\t\t// Listen for messages that are fired before a setting view is rendered.\r\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'before:renderSetting', this.beforeRenderSetting );\r\n\t\t},\r\n\r\n\t\tbeforeRenderSetting: function( settingModel, dataModel, view ) {\r\n\t\t\tif ( 'field' != settingModel.get( 'total_type' ) ) return false;\r\n\r\n\t\t\tvar fields = this.getFields( settingModel );\r\n\r\n\t\t\t/*\r\n\t\t\t * If the field in the payment total isn't in our field list, add it.\r\n\t\t\t *\r\n\t\t\t * Remove the merge tag stuff to get the field key.\r\n\t\t\t */\r\n\t\t\t\r\n\t\t\tvar field_key = dataModel.get( 'payment_total' );\r\n\t\t\tfield_key = field_key.replace( '{field:', '' );\r\n\t\t\tfield_key = field_key.replace( '}', '' );\r\n\t\t\tvar fieldModel = nfRadio.channel( 'fields' ).request( 'get:field', field_key );\r\n\r\n\t\t\tif ( 'undefined' != typeof fieldModel ) {\r\n\t\t\t\tif ( 'undefined' == typeof _.findWhere( fields, { value: dataModel.get( 'payment_total' ) } ) ) {\r\n\t\t\t\t\tfields.push( { label: fieldModel.get( 'label' ), value: '{field:' + fieldModel.get( 'key' ) + '}' } );\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\t/*\r\n\t\t\t * Update our fields options.\r\n\t\t\t */\r\n\t\t\tsettingModel.set( 'options', fields );\r\n\t\t\t\r\n\t\t},\r\n\r\n\t\tgetFields: function( settingModel ) {\r\n\t\t\tvar returnFields = [ settingModel.get( 'default_options' ) ];\r\n\t\t\t// Update our dataModel with all of our product fields.\r\n\t\t\tvar fields = nfRadio.channel( 'fields' ).request( 'get:collection' );\r\n\t\t\t_.each( fields.models, function( field ) {\r\n\t\t\t\tif ( 'number' == field.get( 'type' ) || 'total' == field.get( 'type' ) || 'checkbox' == field.get( 'type' ) ) {\r\n\t\t\t\t\treturnFields.push( { label: field.get( 'label' ), value: '{field:' + field.get( 'key' ) + '}' } );\r\n\t\t\t\t}\r\n\t\t\t} );\r\n\r\n\t\t\treturnFields = _.sortBy( returnFields, function( field ) { return field.label } );\r\n\r\n\t\t\treturn returnFields;\r\n\t\t}\r\n\r\n\t});\r\n\r\n\treturn controller;\r\n} );\n","/**\r\n * Listens to our app channel for settings views being rendered.\r\n *\r\n * If we're rendering a collect payment setting, add our calculations to the data model.\r\n *\r\n * @package Ninja Forms builder\r\n * @subpackage Main App\r\n * @copyright (c) 2017 WP Ninjas\r\n * @since 3.1.7\r\n */\r\ndefine( 'controllers/actions/collectPaymentCalculations',[], function() {\r\n    var controller = Marionette.Object.extend( {\r\n        initialize: function() {\r\n            // Listen for messages that are fired before a setting view is rendered.\r\n            this.listenTo( nfRadio.channel( 'app' ), 'before:renderSetting', this.beforeRenderSetting );\r\n        },\r\n\r\n        beforeRenderSetting: function( settingModel, dataModel, view ) {\r\n            if ( 'calc' == settingModel.get( 'total_type' ) ) {\r\n                var calcModels = nfRadio.channel( 'app' ).request( 'get:formModel' );\r\n                var calcs = this.getCalcs( calcModels, settingModel );\r\n\r\n                settingModel.set( 'options', calcs );\r\n            }\r\n        },\r\n\r\n        getCalcs: function( calcModels, settingModel ) {\r\n            var returnCalcs = [ settingModel.get( 'default_options' ) ];\r\n\r\n            // Update our dataModel with all of our product fields.\r\n            var calcs = calcModels.get( 'settings' ).get( 'calculations' );\r\n\r\n            _.each( calcs.models, function( calc ) {\r\n                returnCalcs.push( { label: calc.get( 'name' ), value: '{calc:' + calc.get( 'name' ) + '}' } );\r\n            } );\r\n\r\n            returnCalcs = _.sortBy( returnCalcs, function( calc ) { return calc.label } );\r\n\r\n            return returnCalcs;\r\n        }\r\n\r\n    });\r\n\r\n    return controller;\r\n} );\n","/**\r\n * Listens to our app channel for settings views being rendered.\r\n *\r\n * If we haven't set a total_type, then set the total_type to fixed.\r\n *\r\n * @package Ninja Forms builder\r\n * @subpackage Main App\r\n * @copyright (c) 2017 WP Ninjas\r\n * @since 3.1.7\r\n */\r\ndefine( 'controllers/actions/collectPaymentFixed',[], function() {\r\n    var controller = Marionette.Object.extend( {\r\n        initialize: function() {\r\n            // Listen for messages that are fired before a setting view is rendered.\r\n            this.listenTo( nfRadio.channel( 'app' ), 'before:renderSetting', this.beforeRenderSetting );\r\n        },\r\n\r\n        beforeRenderSetting: function( settingModel, dataModel, view ) {\r\n\r\n            if ( 'payment_total_type' != settingModel.get( 'name' ) || _.isEmpty( dataModel.get( 'payment_total' ) ) ) return false;\r\n\r\n            /*\r\n             * If we don't have a payment total type and we have a payment total, set our total type to the appropriate total type.\r\n             */\r\n            if ( ( 'undefined' == dataModel.get( 'payment_total_type' ) || _.isEmpty( dataModel.get( 'payment_total_type' ) ) ) ) {\r\n                /*\r\n                 * If payment_total is a field merge tag, set payment_total_type to \"field\"\r\n                 */\r\n\r\n                if ( -1 != dataModel.get( 'payment_total' ).indexOf( '{field' ) ) {\r\n                    dataModel.set( 'payment_total_type', 'field' );\r\n                } else if ( -1 != dataModel.get( 'payment_total' ).indexOf( '{calc' ) ) {\r\n                    dataModel.set( 'payment_total_type', 'calc' );\r\n                } else {\r\n                    dataModel.set( 'payment_total_type', 'fixed' );\r\n                }   \r\n            }\r\n        },\r\n\r\n    });\r\n\r\n    return controller;\r\n} );\n","/**\r\n * When we init a collect payment action, listen for calc changes\r\n * \r\n * @package Ninja Forms builder\r\n * @subpackage Main App\r\n * @copyright (c) 2017 WP Ninjas\r\n * @since 3.1.7\r\n */\r\ndefine( 'controllers/actions/collectPayment',[], function( settingCollection ) {\r\n\tvar controller = Marionette.Object.extend( {\r\n\t\tinitialize: function() {\r\n\t\t\t/*\r\n\t\t\t * When we init a collect payment action model, register a listener for calc changes.\r\n\t\t\t */\r\n\t\t\tthis.listenTo( nfRadio.channel( 'actions-collectpayment' ), 'init:actionModel', this.initCollectPayment );\r\n\t\t\t\r\n\t\t\t/*\r\n\t\t\t * Before we render our total field, we may want to update its value.\r\n\t\t\t */\r\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'before:renderSetting', this.maybeClearTotal );\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * When a collect payment action is init'd, register a listener for calc changes and update our data appropriately.\r\n\t\t * @since  3.1.7\r\n\t\t * @param  {backbone.model} actionModel \r\n\t\t * @return {void}\r\n\t\t */\r\n\t\tinitCollectPayment: function( actionModel )  {\r\n\t\t\tactionModel.listenTo( nfRadio.channel( 'calcs' ), 'update:calcName', this.maybeUpdateTotal );\r\n        },\r\n\r\n\t\t//TODO: Add in an error that will not allow drawer to close until total type and total value is selected.\r\n\t\tmaybeError: function(){},\r\n\r\n\t\tmaybeUpdateTotal: function( optionModel, oldName ) {\r\n\t\t\t/*\r\n\t\t\t * We have changed a calculation. Make sure that 'calc' is our payment total type.\r\n\t\t\t */\r\n\t\t\tif ( 'calculation' != this.get( 'payment_total_type' ) ) {\r\n\t\t\t\treturn\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\t/*\r\n\t\t\t * Check our payment_total setting for the old merge tag and replace it with the new one.\r\n\t\t\t */\r\n\t\t\tvar newVal = this.get( 'payment_total' ).replace( '{calc:' + oldName + '}', '{calc:' + optionModel.get( 'name' ) + '}' );\r\n\t\t\tthis.set( 'payment_total', newVal );\r\n\t\t},\r\n\r\n\t\tmaybeClearTotal: function( settingModel, dataModel, view ) {\r\n            /*\r\n             * If our payment_total is a merge tag, clear it when we select the \"fixed\" option.\r\n             */\r\n            if ( 'fixed' == dataModel.get( 'payment_total_type' ) ) {\r\n                if ( -1 != dataModel.get( 'payment_total' ).indexOf( '{field' ) || -1 != dataModel.get( 'payment_total' ).indexOf( '{calc' ) ) {\r\n                    dataModel.set( 'payment_total', '' );\r\n                }\r\n            }\r\n\t\t}\r\n\r\n\t});\r\n\r\n\treturn controller;\r\n} );\n","/**\r\n * Creates and stores a collection of form setting types. This includes all of the settings shown when editing a field.\r\n *\r\n * Loops over our preloaded data and adds that to our form setting type collection\r\n *\r\n * Also responds to requests for data about form setting types\r\n *\r\n * @package Ninja Forms builder\r\n * @subpackage Advanced\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'controllers/advanced/types',[\r\n\t\t'models/app/typeCollection'\r\n\t],\r\n\tfunction(\r\n\t\tTypeCollection\r\n\t) {\r\n\tvar controller = Marionette.Object.extend( {\r\n\t\tinitialize: function() {\r\n\t\t\t// Create our field type collection\r\n\t\t\tthis.collection = new TypeCollection( formSettingTypeData );\r\n\r\n\t\t\t// Respond to requests to get field type, collection, settings, and sections\r\n\t\t\tnfRadio.channel( 'settings' ).reply( 'get:type', this.getType, this );\r\n\t\t\tnfRadio.channel( 'settings' ).reply( 'get:typeCollection', this.getCollection, this );\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Return a field type by id\r\n\t\t *\r\n\t\t * @since  3.0\r\n\t\t * @param  string \t\t\tid \tfield type\r\n\t\t * @return backbone.model    \tfield type model\r\n\t\t */\r\n\t\tgetType: function( id ) {\r\n\t\t\treturn this.collection.get( id );\r\n        },\r\n\r\n        /**\r\n         * Return the installed action type collection\r\n         *\r\n         * @since  3.0\r\n         * @return backbone.collection    \tfield type collection\r\n         */\r\n\t\tgetCollection: function() {\r\n        \treturn this.collection;\r\n        }\r\n\t});\r\n\r\n\treturn controller;\r\n} );\r\n\n","/**\r\n * Model that represents our form settings.\r\n * \r\n * @package Ninja Forms builder\r\n * @subpackage Form Settings\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'models/advanced/settingsModel',[], function() {\r\n\tvar model = Backbone.Model.extend( {\r\n\t\tdefaults: {\r\n\t\t\tobjectType: 'Form Setting',\r\n\t\t\teditActive: false\r\n\t\t},\r\n\r\n\t\tinitialize: function() {\r\n\t\t\t// Listen for model attribute changes\r\n\t\t\tthis.bind( 'change', this.changeSetting, this );\r\n\t\t\t/*\r\n\t\t\t * Check to see if we have any setting defaults to set.\r\n\t\t\t */\r\n\t\t\tvar formSettings = nfRadio.channel( 'settings' ).request( 'get:collection' );\r\n\t\t\t_.each( formSettings.models, function( settingModel ) {\r\n\t\t\t\tif ( 'undefined' == typeof this.get( settingModel.get( 'name' ) ) ) {\r\n\t\t\t\t\tthis.set( settingModel.get( 'name' ), settingModel.get( 'value' ), { silent: true } );\r\n\t\t\t\t}\r\n\t\t\t\tnfRadio.channel( settingModel.get( 'type' ) ).trigger( 'init:dataModel', this, settingModel );\r\n\t\t\t}, this );\r\n\r\n\t\t\tthis.listenTo( nfRadio.channel( 'app' ), 'fire:updateFieldKey', this.updateFieldKey );\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * When we change the model attributes, fire an event saying we've changed something.\r\n\t\t * \r\n\t\t * @since  3.0\r\n\t\t * @return void\r\n\t\t */\r\n\t\tchangeSetting: function( model, options) {\r\n\t\t\tnfRadio.channel( 'app' ).trigger( 'update:setting', this, options.settingModel );\r\n\t\t},\r\n\r\n\t\tupdateFieldKey: function( keyModel, settingModel ) {\r\n\t\t\tnfRadio.channel( 'app' ).trigger( 'replace:fieldKey', this, keyModel, settingModel );\r\n\t\t}\r\n\t} );\r\n\t\r\n\treturn model;\r\n} );\n","/**\r\n * Handles interactions with our form settings collection.\r\n * \r\n * @package Ninja Forms builder\r\n * @subpackage Advanced\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'controllers/advanced/data',['models/advanced/settingsModel'], function( settingsModel ) {\r\n\tvar controller = Marionette.Object.extend( {\r\n\t\tinitialize: function() {\r\n\t\t\t// Load our action collection from our localized form data\r\n\t\t\tthis.model = new settingsModel( preloadedFormData.settings );\r\n\r\n\t\t\tnfRadio.channel( 'settings' ).reply( 'get:settings', this.getSettings, this );\r\n\t\t\tnfRadio.channel( 'settings' ).reply( 'get:setting', this.getSetting, this );\r\n\t\t\tnfRadio.channel( 'settings' ).reply( 'update:setting', this.updateSetting, this );\r\n\t\t},\r\n\r\n\t\tgetSettings: function() {\r\n\t\t\treturn this.model;\r\n\t\t},\r\n\r\n\t\tupdateSetting: function( name, value, silent ) {\r\n\t\t\tsilent = silent || false;\r\n\t\t\tthis.model.set( name, value, { silent: silent } );\r\n\t\t},\r\n\r\n\t\tgetSetting: function( name ) {\r\n\t\t\treturn this.model.get( name );\r\n\t\t}\r\n\t});\r\n\r\n\treturn controller;\r\n} );\n","/**\r\n * Fetches settings models so that we can get setting information\r\n * \r\n * @package Ninja Forms builder\r\n * @subpackage Advanced\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'controllers/advanced/formSettings',['models/app/settingCollection'], function( settingCollection ) {\r\n\tvar controller = Marionette.Object.extend( {\r\n\t\tinitialize: function() {\r\n\t\t\tthis.collection = new settingCollection( formSettings, { objectType: 'settings' } );\r\n\t\t\t\t\t\r\n\t\t\t// Responds to requests for settings models.\r\n\t\t\tnfRadio.channel( 'settings' ).reply( 'get:settingModel', this.getSettingModel, this );\r\n\r\n\t\t\t// Responds to requests for our setting collection\r\n\t\t\tnfRadio.channel( 'settings' ).reply( 'get:collection', this.getSettingCollection, this );\r\n\t\t},\r\n\r\n\t\tgetSettingModel: function( name ) {\r\n\t\t\treturn this.collection.findWhere( { name: name } );\r\n\t\t},\r\n\r\n\t\tgetSettingCollection: function() {\r\n\t\t\treturn this.collection;\r\n\t\t}\r\n\r\n\t});\r\n\r\n\treturn controller;\r\n} );\n","/**\r\n * Handles adding and removing the active class from form settings currently being edited.\r\n * \r\n * @package Ninja Forms builder\r\n * @subpackage Advanced\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'controllers/advanced/editActive',[], function() {\r\n\tvar controller = Marionette.Object.extend( {\r\n\t\tinitialize: function() {\r\n\t\t\t// Respond to requests to remove the active class from all our fields.\r\n\t\t\tnfRadio.channel( 'settings' ).reply( 'clear:editActive', this.clearEditActive, this );\r\n\t\t\t// Listen for the closing drawer so that we can remove all of our active classes.\r\n\t\t\tthis.listenTo( nfRadio.channel( 'drawer-editSettings' ), 'before:closeDrawer', this.clearEditActive );\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Loops through our fields collection and sets editActive to false.\r\n\t\t * \r\n\t\t * @since  3.0\r\n\t\t * @return void\r\n\t\t */\r\n        clearEditActive: function() {\r\n            var collection = nfRadio.channel( 'settings' ).request( 'get:typeCollection' );\r\n            _.each( collection.models, function( field ) {\r\n\t\t\t\tfield.set( 'editActive', false );\r\n            } );\r\n        }\r\n\t});\r\n\r\n\treturn controller;\r\n} );\r\n\n","/**\r\n * Listens for clicks on our form settings sections.\r\n * \r\n * @package Ninja Forms builder\r\n * @subpackage Advanced\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'controllers/advanced/clickEdit',['models/advanced/settingsModel'], function( settingsModel ) {\r\n\tvar controller = Marionette.Object.extend( {\r\n\t\tinitialize: function() {\r\n\t\t\tthis.listenTo( nfRadio.channel( 'settings' ), 'click:edit', this.clickEdit );\r\n\t\t},\r\n\r\n\t\tclickEdit: function( e, typeModel ) {\r\n\t\t\tvar model = nfRadio.channel( 'settings' ).request( 'get:settings' );\r\n\t\t\tnfRadio.channel( 'app' ).request( 'open:drawer', 'editSettings', { model: model, groupCollection: typeModel.get( 'settingGroups' ), typeModel: typeModel } );\r\n\t\t\tvar preventClose = nfRadio.channel( 'drawer' ).request( 'get:preventClose' );\r\n\t\t\tif ( ! preventClose ) {\r\n\t\t\t\ttypeModel.set( 'editActive', true );\r\n\t\t\t}\r\n\t\t}\r\n\t});\r\n\r\n\treturn controller;\r\n} );\n","/**\r\n * Makes sure that calculations don't reference calculations with a lower order.\r\n *\r\n * For example, our first caclulation can't reference the second, but the second can reference the first.\r\n * \r\n * @package Ninja Forms builder\r\n * @subpackage Advanced\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'controllers/advanced/calculations',[], function() {\r\n\tvar controller = Marionette.Object.extend( {\r\n\t\tinitialize: function() {\r\n\t\t\t/*\r\n\t\t\t * When someone types in the \"name\" or \"eq\" portion of our calculation, we need to make sure\r\n\t\t\t * that they haven't duplicated a name or made a bad EQ reference.\r\n\t\t\t */\r\n\t\t\tthis.listenTo( nfRadio.channel( 'option-repeater-calculations' ), 'keyup:option', this.keyUp );\r\n\t\t\t/*\r\n\t\t\t * Same thing for when our calculation option is updated\r\n\t\t\t */\r\n\t\t\tthis.listenTo( nfRadio.channel( 'option-repeater-calculations' ), 'update:option', this.updateCalc );\r\n\t\t\t/*\r\n\t\t\t * When we sort our calcluations, we need to make sure that we don't get any bad EQ\r\n\t\t\t * references.\r\n\t\t\t */\r\n\t\t\tthis.listenTo( nfRadio.channel( 'option-repeater-calculations' ), 'sort:option', this.sortCalc );\r\n\t\t},\r\n\r\n\t\tkeyUp: function( e, optionModel ) {\r\n\t\t\t// Get our current value\r\n\t\t\tvar value = jQuery( e.target ).val();\r\n\t\t\t// Check to see if we're editing a name or eq\r\n            var id = jQuery( e.target ).data( 'id' );\r\n\t\t\tif( 'name' == id ) { // We are editing the name field\r\n\t\t\t\t// Check to see if our name already exists.\r\n\t\t\t\tthis.checkName( value, optionModel );\r\n\t\t\t\tthis.checkEQ( optionModel.get( 'eq' ), optionModel );\r\n\t\t\t} else if( 'eq' == id ) { // We're editing the eq\r\n\t\t\t\t// Check to see if there are any calcs referenced in our eq\r\n\t\t\t\tthis.checkEQ( value, optionModel );\r\n\t\t\t} else if( 'dec' == id ) { // We're editing the dec\r\n                // Check to see that we have a non-negative integer\r\n                this.checkDec( value, optionModel );\r\n            }\r\n\t\t},\r\n\r\n\t\tupdateCalc: function( optionModel ) {\r\n\t\t\tthis.checkName( optionModel.get( 'name' ), optionModel, false );\r\n\t\t\tthis.checkEQ( optionModel.get( 'eq' ), optionModel );\r\n\t\t\tthis.checkDec( optionModel.get( 'dec' ), optionModel );\r\n\r\n\t\t\tBackbone.Radio.channel( 'calcs' ).trigger( 'update:calc', optionModel );\r\n\t\t},\r\n\r\n\t\tsortCalc: function( optionModel, setting ) {\r\n\t\t\tthis.checkAllCalcs( setting.collection );\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Check to see if a calc name exists.\r\n\t\t * \r\n\t\t * @since  3.0\r\n\t\t * @param  string \t\t\tname        calc name to check\r\n\t\t * @param  backbone.model \toptionModel \r\n\t\t * @return void\r\n\t\t */\r\n\t\tcheckName: function( name, optionModel, silent ) {\r\n\t\t\tsilent = silent || true;\r\n\t\t\t// Get our current errors, if any.\r\n\t\t\tvar errors = optionModel.get( 'errors' );\r\n\t\t\t// Search our calc collection for our name\r\n\t\t\tvar found = optionModel.collection.where( { name: jQuery.trim( name ) } );\r\n\r\n\t\t\t// If the name that was passed is the same as our current name, return false.\r\n\t\t\tif ( name == optionModel.get( 'name' ) ) {\r\n\t\t\t\tfound = [];\r\n\t\t\t}\r\n\r\n\t\t\t// If our name exists, add an errors to the option model\r\n\t\t\tif ( 0 != found.length ) {\r\n\t\t\t\terrors.nameExists = 'Calculation names must be unique. Please enter another name.';\r\n\t\t\t} else {\r\n\t\t\t\tvar oldName = optionModel.get( 'name' );\r\n\t\t\t\toptionModel.set( 'name', name, { silent: silent } );\r\n\t\t\t\tnfRadio.channel( 'calcs' ).trigger( 'update:calcName', optionModel, oldName );\r\n\t\t\t\tdelete errors.nameExists;\r\n\t\t\t}\r\n\r\n\t\t\toptionModel.set( 'errors', errors );\r\n\t\t\toptionModel.trigger( 'change:errors', optionModel );\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Check to see if an eq contains a reference to a calc at a lower priority.\r\n\t\t *\r\n\t\t * @since  3.0\r\n\t\t * @param  string \t\t\teq          our equation\r\n\t\t * @param  backbone.model \toptionModel\r\n\t\t * @return void\r\n\t\t */\r\n\t\tcheckEQ: function( eq, optionModel ) {\r\n\t\t\t// Get any current errors on our optionModel\r\n\t\t\tvar errors = optionModel.get( 'errors' );\r\n\t\t\t/*\r\n\t\t\t * We're looking for two errors:\r\n\t\t\t * - Calculations that are below the current one can't be processed.\r\n\t\t\t * - Calculations can't refer to themselves.\r\n\t\t\t */ \r\n\t\t\tvar errorSelfRef = false;\r\n\t\t\tvar errorFutureCalc = false;\r\n\t\t\t// Regex that searches for {calc:key}\r\n\t\t\tvar calcs = eq.match( new RegExp( /{calc:(.*?)}/g ) );\r\n\t\t\t/*\r\n\t\t\t * Calcs will be an array like:\r\n\t\t\t * ['{calc:test}'], ['{calc:another}']\r\n\t\t\t * \r\n\t\t\t * If we have any calcs in the eq, loop through them and search for the errors.\r\n\t\t\t */\r\n\t\t\tif ( calcs ) {\r\n\t\t\t\tvar calculations = optionModel.collection;\r\n\t\t\t\t// Maps a function to each item in our calcs array.\r\n\t\t\t\tcalcs = calcs.map( function( calc ) {\r\n\t\t\t\t\t// calc will be {calc:name}\r\n\t\t\t\t\tvar name = calc.replace( '}', '' ).replace( '{calc:', '' );\r\n\t\t\t\t\t// Get our optionModel from our calculations collection.\r\n\t\t\t\t\tvar targetCalc = calculations.findWhere( { name: name } );\r\n\t\t\t\t\tif ( name == optionModel.get( 'name' ) ) {\r\n\t\t\t\t\t\t// If we already have a calc with this name, set an error.\r\n\t\t\t\t\t\terrors.selfRef = 'A calculation can\\'t reference itself!';\r\n\t\t\t\t\t\terrorSelfRef = true;\r\n\t\t\t\t\t} else if ( targetCalc && targetCalc.get( 'order' ) > optionModel.get( 'order' ) ) {\r\n\t\t\t\t\t\t// If the calc is after this one, set an error. \r\n\t\t\t\t\t\terrorFutureCalc = true;\r\n\t\t\t\t\t\terrors.futureCalc = 'Can\\'t reference a future calculation!';\r\n\t\t\t\t\t}\r\n\t\t\t\t} );\r\n\t\t\t}\r\n\r\n\t\t\t// If we didn't find any self ref errors, remove the key.\r\n\t\t\tif ( ! errorSelfRef ) {\r\n\t\t\t\tdelete errors.selfRef;\r\n\t\t\t}\r\n\r\n\t\t\t// If we didn't find any future calc errors, remove the key.\r\n\t\t\tif ( ! errorFutureCalc ) {\r\n\t\t\t\tdelete errors.futureCalc;\r\n\t\t\t}\r\n\r\n\t\t\t// Set errors and trigger our optionModel change.\r\n\t\t\toptionModel.set( 'errors', errors );\r\n\t\t\toptionModel.trigger( 'change:errors', optionModel );\r\n\r\n\t\t},\r\n\r\n        /**\r\n         * Ceck to see if a dec is an integer value.\r\n         * \r\n         * @since 3.1\r\n         * @param string            dec         our decimal value\r\n         * @param backbone.model    optionModel\r\n         * @return void\r\n         */\r\n        checkDec: function( dec, optionModel ) {\r\n            // If dec isn't defined, bail...\r\n            if( 'undefined' === typeof(dec) ) return false;\r\n\t\t\t// Get our current errors, if any.\r\n\t\t\tvar errors = optionModel.get( 'errors' );\r\n            /**\r\n             * We're looking for one error:\r\n             * - dec is not a non-negative integer.\r\n             */\r\n            var errorNonIntDec = false;\r\n            \r\n            // Get our target value and see if it matches what we got.\r\n            var checked = Math.abs( parseInt( dec.trim() ) );\r\n            if ( dec.trim() !== '' && checked.toString() !== dec.trim() ) {\r\n                errorNonIntDec = true;\r\n                errors.nonIntDec = 'Decimals must be a non-negative integer!';\r\n            }\r\n            \r\n            // If our dec value is a non-negative integer.\r\n            if ( ! errorNonIntDec ) {\r\n                delete errors.nonIntDec;\r\n            }\r\n            \r\n\t\t\t// Set errors and trigger our optionModel change.\r\n\t\t\toptionModel.set( 'errors', errors );\r\n\t\t\toptionModel.trigger( 'change:errors', optionModel );\r\n            \r\n        },\r\n        \r\n\t\tcheckAllCalcs: function( collection ) {\r\n\t\t\tvar that = this;\r\n\t\t\tcollection.models.map( function( opt ) {\r\n\t\t\t\tthat.checkName( opt.get( 'name' ), opt );\r\n\t\t\t\tthat.checkEQ( opt.get( 'eq' ), opt );\r\n                that.checkDec( opt.get( 'dec' ), opt );\r\n\t\t\t} );\r\n\t\t}\r\n\r\n\t});\r\n\r\n\treturn controller;\r\n} );\r\n\n","/**\r\n * Loads all of our controllers using Require JS.\r\n * \r\n * @package Ninja Forms builder\r\n * @subpackage Fields\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine(\r\n\t'controllers/loadControllers',[\r\n\t\t/*\r\n\t\t * Application controllers\r\n\t\t */\r\n\t\t'controllers/app/remote',\r\n\t\t'controllers/app/drawer',\r\n\t\t'controllers/app/drawerConfig',\r\n\t\t'controllers/app/domainConfig',\r\n\t\t'controllers/app/data',\t\t\r\n\t\t'controllers/app/drawerToggleSettingGroup',\r\n\t\t'controllers/app/updateDB',\r\n\t\t'controllers/app/formData',\r\n\t\t'controllers/app/previewLink',\r\n\t\t'controllers/app/menuButtons',\r\n\t\t'controllers/app/trackChanges',\r\n\t\t'controllers/app/undoChanges',\r\n\t\t'controllers/app/publishResponse',\r\n\t\t'controllers/app/changeDomain',\r\n\t\t'controllers/app/pushstate',\r\n\t\t'controllers/app/hotkeys',\r\n\t\t'controllers/app/cleanState',\r\n\t\t'controllers/app/coreUndo',\r\n\t\t'controllers/app/cloneModelDeep',\r\n\t\t'controllers/app/getSettingChildView',\r\n\t\t'controllers/app/changeSettingDefault',\r\n\t\t'controllers/app/fieldset',\r\n\t\t'controllers/app/toggleSetting',\r\n\t\t'controllers/app/itemControls',\r\n\t\t'controllers/app/mergeTags',\r\n\t\t'controllers/app/mergeTagBox',\r\n\t\t'controllers/app/itemSettingFill',\r\n\t\t'controllers/app/confirmPublish',\r\n\t\t'controllers/app/rte',\r\n\t\t'controllers/app/settingFieldSelect',\r\n\t\t'controllers/app/settingFieldList',\r\n\t\t'controllers/app/settingHTML',\r\n\t\t'controllers/app/settingColor',\r\n\t\t'controllers/app/changeMenu',\r\n\t\t'controllers/app/mobile',\r\n\t\t'controllers/app/notices',\r\n\t\t'controllers/app/unloadCheck',\r\n\t\t'controllers/app/formContentFilters',\r\n\t\t'controllers/app/formContentGutterFilters',\r\n\t\t'controllers/app/cloneCollectionDeep',\r\n\t\t'controllers/app/trackKeyDown',\r\n\t\t'controllers/app/perfectScroll',\r\n\t\t'controllers/app/getNewSettingGroupCollection',\r\n\t\t'controllers/app/settingMedia',\r\n\t\t/*\r\n\t\t * Fields domain controllers\r\n\t\t */\r\n\t\t'controllers/fields/types',\r\n\t\t'controllers/fields/fieldTypeDrag',\r\n\t\t'controllers/fields/stagingDrag',\r\n\t\t'controllers/fields/staging',\r\n\t\t'controllers/fields/stagingSortable',\r\n\t\t'controllers/fields/filterTypes',\r\n\t\t'controllers/fields/sortable',\r\n\t\t'controllers/fields/data',\r\n\t\t'controllers/app/optionRepeater',\r\n\t\t'controllers/fields/editActive',\r\n\t\t'controllers/fields/fieldSettings',\r\n\t\t'controllers/fields/fieldCreditCard',\r\n\t\t'controllers/fields/fieldList',\r\n\t\t'controllers/fields/fieldPassword',\r\n\t\t'controllers/fields/fieldQuantity',\r\n\t\t'controllers/fields/fieldShipping',\r\n\t\t'controllers/fields/key',\r\n\t\t'controllers/fields/notices',\r\n\t\t'controllers/fields/mobile',\r\n\t\t'controllers/fields/savedFields',\r\n\t\t'controllers/fields/fieldDatepicker',\r\n\t\t'controllers/fields/fieldDisplayCalc',\r\n\r\n\t\t/*\r\n\t\t * TODO: Actions domain controllers\r\n\t\t */\r\n\t\t'controllers/actions/types',\r\n\t\t'controllers/actions/data',\r\n\t\t'controllers/actions/actionSettings',\r\n\t\t'controllers/actions/editActive',\r\n\t\t'controllers/actions/emailFromSetting',\r\n\t\t'controllers/actions/addActionTypes',\r\n\t\t'controllers/actions/typeDrag',\r\n\t\t'controllers/actions/droppable',\r\n\t\t'controllers/actions/filterTypes',\r\n\t\t'controllers/actions/newsletterList',\r\n\t\t'controllers/actions/deleteFieldListener',\r\n\t\t'controllers/actions/collectPaymentFields',\r\n\t\t'controllers/actions/collectPaymentCalculations',\r\n\t\t'controllers/actions/collectPaymentFixed',\r\n\t\t'controllers/actions/collectPayment',\r\n\r\n\t\t/*\r\n\t\t * TODO: Settings domain controllers\r\n\t\t */\r\n\t\t'controllers/advanced/types',\r\n\t\t'controllers/advanced/data',\r\n\t\t'controllers/advanced/formSettings',\r\n\t\t'controllers/advanced/editActive',\r\n\t\t'controllers/advanced/clickEdit',\r\n\t\t'controllers/advanced/calculations'\r\n\t],\r\n\tfunction(\r\n\t\t/*\r\n\t\t * Application controllers\r\n\t\t */\r\n\t\tRemote,\r\n\t\tDrawer,\r\n\t\tDrawerConfig,\r\n\t\tDomainConfig,\r\n\t\tAppData,\r\n\t\tDrawerToggleSettingGroup,\r\n\t\tUpdateDB,\r\n\t\tFormData,\r\n\t\tPreviewLink,\r\n\t\tAppMenuButtons,\r\n\t\tAppTrackChanges,\r\n\t\tAppUndoChanges,\r\n\t\tAppPublishResponse,\r\n\t\tAppChangeDomain,\r\n\t\tPushstate,\r\n\t\tHotkeys,\r\n\t\tCleanState,\r\n\t\tCoreUndo,\r\n\t\tCloneModelDeep,\r\n\t\tDrawerSettingChildView,\r\n\t\tChangeSettingDefault,\r\n\t\tFieldset,\r\n\t\tToggleSetting,\r\n\t\tItemControls,\r\n\t\tMergeTags,\r\n\t\tMergeTagsBox,\r\n\t\tItemSettingFill,\r\n\t\tConfirmPublish,\r\n\t\tRTE,\r\n\t\tSettingFieldSelect,\r\n\t\tSettingFieldList,\r\n\t\tSettingHTML,\r\n\t\tSettingColor,\r\n\t\tChangeMenu,\r\n\t\tAppMobile,\r\n\t\tAppNotices,\r\n\t\tAppUnloadCheck,\r\n\t\tFormContentFilters,\r\n\t\tFormContentGutterFilters,\r\n\t\tCloneCollectionDeep,\r\n\t\tTrackKeyDown,\r\n\t\tPerfectScroll,\r\n\t\tGetNewSettingGroupCollection,\r\n\t\tSettingMedia,\r\n\t\t/*\r\n\t\t * Fields domain controllers\r\n\t\t */\r\n\t\tFieldTypes,\r\n\t\tFieldTypeDrag,\r\n\t\tFieldStagingDrag,\r\n\t\tStagedFieldsData,\r\n\t\tStagedFieldsSortable,\r\n\t\tDrawerFilterFieldTypes,\r\n\t\tMainContentFieldsSortable,\r\n\t\tFieldData,\r\n\t\tOptionRepeater,\r\n\t\tFieldsEditActive,\r\n\t\tFieldSettings,\r\n\t\tFieldCreditCard,\r\n\t\tFieldList,\r\n\t\tFieldPassword,\r\n\t\tFieldQuantity,\r\n\t\tFieldShipping,\r\n\t\tFieldKey,\r\n\t\tNotices,\r\n\t\tFieldsMobile,\r\n\t\tSavedFields,\r\n\t\tFieldDatepicker,\r\n\t\tFieldDisplayCalc,\r\n\t\t/*\r\n\t\t * TODO: Actions domain controllers\r\n\t\t */\r\n\t\tActionTypes,\r\n\t\tActionData,\r\n\t\tActionSettings,\r\n\t\tActionEditActive,\r\n\t\tActionEmailFromSetting,\r\n\t\tActionAddTypes,\r\n\t\tActionTypeDrag,\r\n\t\tActionDroppable,\r\n\t\tActionFilterTypes,\r\n\t\tActionNewsletterList,\r\n\t\tActionDeleteFieldListener,\r\n\t\tActionCollectPaymentFields,\r\n\t\tActionCollectPaymentCalculations,\r\n\t\tActionCollectPaymentFixed,\r\n\t\tActionCollectPayment,\r\n\r\n\t\t/*\r\n\t\t * TODO: Settings domain controllers\r\n\t\t */\r\n\t\tSettingTypes,\r\n\t\tSettingData,\r\n\t\tFormSettings,\r\n\t\tSettingsEditActive,\r\n\t\tSettingsClickEdit,\r\n\t\tAdvancedCalculations\r\n\t\t\r\n\t) {\r\n\t\tvar controller = Marionette.Object.extend( {\r\n\t\t\tinitialize: function() {\r\n\t\t\t\t/*\r\n\t\t\t\t * Application controllers\r\n\t\t\t\t */\r\n\t\t\t\tnew FormContentFilters();\r\n\t\t\t\tnew FormContentGutterFilters();\r\n\t\t\t\tnew Hotkeys();\r\n\t\t\t\tnew Remote();\r\n\t\t\t\tnew Drawer();\r\n\t\t\t\tnew DrawerConfig();\r\n\t\t\t\tnew DomainConfig();\r\n\t\t\t\tnew DrawerToggleSettingGroup();\r\n\t\t\t\tnew PreviewLink();\r\n\t\t\t\tnew AppMenuButtons();\r\n\t\t\t\tnew AppTrackChanges();\r\n\t\t\t\tnew AppUndoChanges();\r\n\t\t\t\tnew AppPublishResponse();\r\n\t\t\t\tnew AppChangeDomain();\r\n\t\t\t\tnew CleanState();\r\n\t\t\t\tnew CoreUndo();\r\n\t\t\t\tnew CloneModelDeep();\r\n\t\t\t\tnew ItemControls();\r\n\t\t\t\tnew ConfirmPublish();\r\n\t\t\t\tnew RTE();\r\n\t\t\t\tnew SettingFieldSelect();\r\n\t\t\t\tnew SettingFieldList();\r\n\t\t\t\tnew SettingHTML();\r\n\t\t\t\tnew SettingColor();\r\n\t\t\t\tnew SettingMedia();\r\n\t\t\t\tnew ChangeMenu();\r\n\t\t\t\tnew AppMobile();\r\n\t\t\t\tnew AppNotices();\r\n\t\t\t\tnew AppUnloadCheck();\r\n\t\t\t\tnew UpdateDB();\r\n\t\t\t\tnew CloneCollectionDeep();\r\n\t\t\t\tnew TrackKeyDown();\r\n\t\t\t\tnew PerfectScroll();\r\n\t\t\t\tnew GetNewSettingGroupCollection();\r\n\t\t\t\t// new Pushstate();\r\n\t\t\t\t/*\r\n\t\t\t\t * Fields domain controllers\r\n\t\t\t\t * \r\n\t\t\t\t * Field-specific controllers should be loaded before our field type controller.\r\n\t\t\t\t * This ensures that any 'init' hooks are properly registered.\r\n\t\t\t\t */\r\n\t\t\t\tnew Fieldset();\r\n\t\t\t\tnew OptionRepeater();\r\n\r\n\t\t\t\tnew FieldTypes();\r\n\t\t\t\tnew FieldTypeDrag();\r\n\t\t\t\tnew FieldStagingDrag();\r\n\t\t\t\tnew StagedFieldsData();\r\n\t\t\t\tnew StagedFieldsSortable();\r\n\t\t\t\tnew DrawerFilterFieldTypes();\r\n\t\t\t\tnew MainContentFieldsSortable();\r\n\t\t\t\tnew ChangeSettingDefault();\r\n\t\t\t\tnew ToggleSetting();\r\n\t\t\t\tnew DrawerSettingChildView();\r\n\t\t\t\tnew FieldsEditActive();\r\n\t\t\t\tnew FieldSettings();\r\n\t\t\t\tnew FieldCreditCard();\r\n\t\t\t\tnew FieldList();\r\n\t\t\t\tnew FieldPassword;\r\n\t\t\t\tnew FieldQuantity();\r\n\t\t\t\tnew FieldShipping();\r\n\t\t\t\tnew FieldKey();\r\n\t\t\t\tnew Notices();\r\n\t\t\t\tnew FieldsMobile();\r\n\t\t\t\tnew SavedFields();\r\n\t\t\t\tnew FieldDatepicker();\r\n\t\t\t\tnew FieldDisplayCalc();\r\n\t\t\t\t/*\r\n\t\t\t\t * TODO: Actions domain controllers\r\n\t\t\t\t */\r\n\t\t\t\tnew ActionNewsletterList();\r\n\t\t\t\tnew ActionDeleteFieldListener();\r\n\t\t\t\tnew ActionCollectPaymentCalculations();\r\n\t\t\t\tnew ActionCollectPayment();\t\t\t\t\r\n\t\t\t\tnew ActionTypes();\r\n\t\t\t\tnew ActionData();\r\n\t\t\t\tnew ActionSettings();\r\n\t\t\t\tnew ActionEditActive();\r\n\t\t\t\tnew ActionEmailFromSetting();\r\n\t\t\t\tnew ActionAddTypes();\r\n\t\t\t\tnew ActionTypeDrag();\r\n\t\t\t\tnew ActionDroppable();\r\n\t\t\t\tnew ActionFilterTypes();\r\n\t\t\t\tnew ActionCollectPaymentFields();\r\n\t\t\t\tnew ActionCollectPaymentFixed();\r\n\r\n\t\t\t\t/*\r\n\t\t\t\t * TODO: Settings domain controllers\r\n\t\t\t\t */\r\n\t\t\t\tnew SettingTypes();\r\n\t\t\t\tnew FormSettings();\r\n\t\t\t\tnew AdvancedCalculations();\r\n\t\t\t\tnew SettingData();\r\n\t\t\t\tnew SettingsEditActive();\r\n\t\t\t\tnew SettingsClickEdit();\r\n\t\t\t\t\r\n\t\t\t\t/*\r\n\t\t\t\t * Data controllers need to be set after every other controller has been setup, even if they aren't domain-specific.\r\n\t\t\t\t * AppData() was after FormData();\r\n\t\t\t\t */\r\n\t\t\t\tnew AppData();\r\n\t\t\t\tnew FieldData();\r\n\t\t\t\tnew FormData();\r\n\t\t\t\tnew MergeTags();\r\n\t\t\t\tnew MergeTagsBox();\r\n\t\t\t\tnew ItemSettingFill();\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\treturn controller;\r\n} );\r\n\n","define( 'views/fields/fieldItem',['views/app/itemControls'], function( itemControlsView ) {\r\n\tvar view = Marionette.LayoutView.extend({\r\n\t\ttagName: 'div',\r\n\t\ttemplate: '#tmpl-nf-main-content-field',\r\n\t\tdoingShortcut: false,\r\n\r\n\t\tregions: {\r\n\t\t\titemControls: '.nf-item-controls'\r\n\t\t},\r\n\r\n\t\tinitialize: function() {\r\n\t\t\tthis.model.on( 'change:editActive', this.render, this );\r\n\t\t\tthis.model.on( 'change:label', this.render, this );\r\n\t\t\tthis.model.on( 'change:required', this.render, this );\r\n\t\t\tthis.model.on( 'change:id', this.render, this );\r\n\t\t},\r\n\r\n\t\tonBeforeDestroy: function() {\r\n\t\t\tthis.model.off( 'change:editActive', this.render );\r\n\t\t\tthis.model.off( 'change:label', this.render );\r\n\t\t\tthis.model.off( 'change:required', this.render );\r\n\t\t\tthis.model.off( 'change:id', this.render );\r\n\t\t},\r\n\r\n\t\tonRender: function() {\r\n\t\t\tthis.$el = this.$el.children();\r\n\t\t\tthis.$el.unwrap();\r\n\t\t\tthis.setElement( this.$el );\r\n\r\n\t\t\tthis.itemControls.show( new itemControlsView( { model: this.model } ) );\r\n\t\t\tjQuery( this.el ).disableSelection();\r\n\r\n\t\t\tif ( nfRadio.channel( 'app' ).request( 'is:mobile' ) ) {\r\n\t\t\t\tjQuery( this.el ).on( 'taphold', function( e, touch ) {\r\n\t\t\t\t\tif ( ! jQuery( e.target ).hasClass( 'nf-edit-settings' ) ) {\r\n\t\t\t\t\t\tjQuery( this ).addClass( 'ui-sortable-helper drag-selected' );\r\n\t\t\t\t\t\tjQuery( this ).ClassyWiggle( 'start', { degrees: ['.65', '1', '.65', '0', '-.65', '-1', '-.65', '0'], delay: 50 } );\r\n\t\t\t\t\t}\r\n\t\t\t\t} );\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\ttemplateHelpers: function () {\r\n\t    \treturn {\r\n\t    \t\trenderClasses: function() {\r\n\t    \t\t\tvar classes = 'nf-field-wrap';\r\n\t    \t\t\tif ( this.editActive ) {\r\n\t    \t\t\t\tclasses += ' active';\r\n\t    \t\t\t}\r\n\t    \t\t\treturn classes;\r\n\t    \t\t},\r\n\t    \t\trenderRequired: function() {\r\n\t    \t\t\tif ( 1 == this.required ) {\r\n\t    \t\t\t\treturn '<span class=\"required\">*</span>';\r\n\t    \t\t\t} else {\r\n\t    \t\t\t\treturn '';\r\n\t    \t\t\t}\r\n\t    \t\t},\r\n\t    \t\tgetFieldID: function() {\r\n\t\t\t\t\tif ( jQuery.isNumeric( this.id ) ) {\r\n\t\t\t\t\t\treturn 'field-' + this.id;\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\treturn this.id;\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\trenderIcon: function() {\r\n\t\t\t\t\tvar type = nfRadio.channel( 'fields' ).request( 'get:type', this.type );\r\n\t\t\t\t\treturn '<span class=\"fa fa-' + type.get( 'icon' ) + '\"></span>';\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t},\r\n\r\n\t\tevents: {\r\n\t\t\t'mouseover .nf-item-control': 'mouseoverItemControl',\r\n\t\t\t'mousedown': 'maybeShortcut',\r\n\t\t\t'click': 'maybeClickEdit',\r\n\t\t\t'singletap': 'maybeTapEdit',\r\n\t\t\t'swipeleft': 'swipeLeft',\r\n\t\t\t'swiperight': 'swipeRight',\r\n\t\t\t'tapend': 'tapend'\r\n\t\t},\r\n\r\n\t\tmaybeClickEdit: function( e ) {\r\n\t\t\tif ( this.doingShortcut ) {\r\n\t\t\t\tthis.doingShortcut = false;\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\r\n\t\t\tif ( ( jQuery( e.target ).parent().hasClass( 'nf-fields-sortable' ) || jQuery( e.target ).parent().hasClass( 'nf-field-wrap' ) || jQuery( e.target ).hasClass( 'nf-field-wrap' ) ) && ! nfRadio.channel( 'app' ).request( 'is:mobile' ) ) {\r\n\t\t\t\tjQuery( ':focus' ).blur();\r\n\t\t\t\tnfRadio.channel( 'app' ).trigger( 'click:edit', e, this.model );\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\tmaybeShortcut: function( e ) {\r\n\t\t\tvar keys = nfRadio.channel( 'app' ).request( 'get:keydown' );\r\n\t\t\t/*\r\n\t\t\t * If the shift key isn't held down, return.\r\n\t\t\t */\r\n\t\t\tif ( -1 == keys.indexOf( 16 ) ) {\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t\t/*\r\n\t\t\t * If we are pressing D, delete this field.\r\n\t\t\t */\r\n\t\t\tif ( -1 != keys.indexOf( 68 ) ) {\r\n\t\t\t\tnfRadio.channel( 'app' ).trigger( 'click:delete', e, this.model );\r\n\t\t\t\tthis.doingShortcut = true;\r\n\t\t\t\treturn false;\r\n\t\t\t} else if ( -1 != keys.indexOf( 67 ) ) {\r\n\t\t\t\tthis.doingShortcut = true;\r\n\t\t\t\tnfRadio.channel( 'app' ).trigger( 'click:duplicate', e, this.model );\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\tmaybeTapEdit: function( e ) {\r\n\t\t\tif ( jQuery( e.target ).parent().hasClass( 'nf-fields-sortable' ) ) {\r\n\t\t\t\tnfRadio.channel( 'app' ).trigger( 'click:edit', e, this.model );\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\tswipeLeft: function( e, touch ) {\r\n\t\t\tjQuery( touch.startEvnt.target ).closest( 'div' ).find( '.nf-item-duplicate' ).show();\r\n\t\t\tjQuery( touch.startEvnt.target ).closest( 'div' ).find( '.nf-item-delete' ).show();\r\n\t\t},\r\n\r\n\t\tswipeRight: function( e, touch ) {\r\n\t\t\tjQuery( touch.startEvnt.target ).closest( 'div' ).find( '.nf-item-duplicate' ).hide();\r\n\t\t\tjQuery( touch.startEvnt.target ).closest( 'div' ).find( '.nf-item-delete' ).hide();\r\n\t\t},\r\n\r\n\t\ttapend: function( e, touch ) {\r\n\t\t\tjQuery( this.el ).ClassyWiggle( 'stop' );\r\n\t\t\tjQuery( this.el ).removeClass( 'ui-sortable-helper drag-selected' );\r\n\t\t},\r\n\r\n\t\tremove: function(){\r\n\t\t\tif ( nfRadio.channel( 'fields' ).request( 'get:removing' ) ) {\r\n\t\t\t\tthis.$el.hide( 'clip', function(){\r\n\t\t\t\t\tjQuery( this ).remove();\r\n\t\t\t\t});\r\n\t\t\t} else {\r\n\t\t\t\tthis.$el.remove();\r\n\t\t\t}\r\n\r\n\t\t\tnfRadio.channel( 'fields' ).request( 'set:removing', false );\r\n\t\t},\r\n\r\n\t\tmouseoverItemControl: function( e ) {\r\n\t\t\tjQuery( this.el ).find( '.nf-item-control' ).css( 'display', '' );\r\n\t\t}\r\n\r\n\t});\r\n\r\n\treturn view;\r\n} );\n","define( 'views/fields/mainContentEmpty',[], function() {\r\n\tvar view = Marionette.ItemView.extend({\r\n\t\ttagName: 'div',\r\n\t\ttemplate: '#tmpl-nf-main-content-fields-empty',\r\n\r\n\t\tonBeforeDestroy: function() {\r\n\t\t\tjQuery( this.el ).parent().removeClass( 'nf-fields-empty-droppable' ).droppable( 'destroy' );\r\n\t\t},\r\n\r\n\t\tonRender: function() {\r\n\t\t\tthis.$el = this.$el.children();\r\n\t\t\tthis.$el.unwrap();\r\n\t\t\tthis.setElement( this.$el );\r\n\t\t},\r\n\r\n\t\tonShow: function() {\r\n\t\t\tif ( jQuery( this.el ).parent().hasClass( 'ui-sortable' ) ) {\r\n\t\t\t\tjQuery( this.el ).parent().sortable( 'destroy' );\r\n\t\t\t}\r\n\t\t\tjQuery( this.el ).parent().addClass( 'nf-fields-empty-droppable' );\r\n\t\t\tjQuery( this.el ).parent().droppable( {\r\n\t\t\t\taccept: function( draggable ) {\r\n\t\t\t\t\tif ( jQuery( draggable ).hasClass( 'nf-stage' ) || jQuery( draggable ).hasClass( 'nf-field-type-button' ) ) {\r\n\t\t\t\t\t\treturn true;\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\tactiveClass: 'nf-droppable-active',\r\n\t\t\t\thoverClass: 'nf-droppable-hover',\r\n\t\t\t\ttolerance: 'pointer',\r\n\t\t\t\tover: function( e, ui ) {\r\n\t\t\t\t\tui.item = ui.draggable;\r\n\t\t\t\t\tnfRadio.channel( 'app' ).request( 'over:fieldsSortable', ui );\r\n\t\t\t\t},\r\n\t\t\t\tout: function( e, ui ) {\r\n\t\t\t\t\tui.item = ui.draggable;\r\n\t\t\t\t\tnfRadio.channel( 'app' ).request( 'out:fieldsSortable', ui );\r\n\t\t\t\t},\r\n\t\t\t\tdrop: function( e, ui ) {\r\n\t\t\t\t\tui.item = ui.draggable;\r\n\t\t\t\t\tnfRadio.channel( 'app' ).request( 'receive:fieldsSortable', ui );\r\n\t\t\t\t\tvar fieldCollection = nfRadio.channel( 'fields' ).request( 'get:collection' );\r\n\t\t\t\t\tfieldCollection.trigger( 'reset', fieldCollection );\r\n\t\t\t\t},\r\n\t\t\t} );\r\n\t\t}\r\n\t});\r\n\r\n\treturn view;\r\n} );\n","/**\r\n * Renders our form title.\r\n *\r\n * @package Ninja Forms builder\r\n * @subpackage App\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'views/app/formTitle',[], function() {\r\n\tvar view = Marionette.ItemView.extend({\r\n\t\ttagName: 'div',\r\n\t\ttemplate: '#tmpl-nf-header-form-title',\r\n\r\n\t\tinitialize: function() {\r\n\t\t\t// When we change the model (to disable it, for example), re-render.\r\n\t\t\tthis.model.on( 'change:title', this.render, this );\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * These functions are available to templates, and help us to remove logic from template files.\r\n\t\t * \r\n\t\t * @since  3.0\r\n\t\t * @return Object\r\n\t\t */\r\n\t\ttemplateHelpers: function() {\r\n\t\t\tvar that = this;\r\n\t    \treturn {\r\n\t    \t\trenderTitle: function(){\r\n\t    \t\t\tvar formData = nfRadio.channel( 'app' ).request( 'get:formModel' );\r\n\t    \t\t\treturn _.escape( formData.get( 'settings' ).get( 'title' ) );\r\n\t\t\t\t},\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t});\r\n\r\n\treturn view;\r\n} );\n","/**\r\n * Return views that might be used in extensions.\r\n * These are un-instantiated views.\r\n * \r\n * @package Ninja Forms builder\r\n * @subpackage Main App\r\n * @copyright (c) 2015 WP Ninjas\r\n * @since 3.0\r\n */\r\ndefine( 'views/loadViews',[ 'views/fields/fieldItem', 'views/fields/mainContentEmpty', 'views/app/formTitle' ], function( fieldItemView, mainContentEmptyView, FormTitleView ) {\r\n\tvar controller = Marionette.Object.extend( {\r\n\t\tinitialize: function() {\r\n\t\t\t// Reply to requests for our field item view.\r\n\t\t\tnfRadio.channel( 'views' ).reply( 'get:fieldItem', this.getFieldItem );\r\n\t\t\r\n\t\t\t// Reply to requests for our empty content view.\r\n\t\t\tnfRadio.channel( 'views' ).reply( 'get:mainContentEmpty', this.getMainContentEmpty );\r\n\t\t\r\n\t\t\t// Reply to requests for our form title view.\r\n\t\t\tnfRadio.channel( 'views' ).reply( 'get:formTitle', this.getFormTitle );\r\n\t\t},\r\n\r\n\t\tgetFieldItem: function( model ) {\r\n\t\t\treturn fieldItemView;\r\n\t\t},\r\n\r\n\t\tgetMainContentEmpty: function() {\r\n\t\t\treturn mainContentEmptyView;\r\n\t\t},\r\n\r\n\t\tgetFormTitle: function() {\r\n\t\t\treturn FormTitleView;\r\n\t\t}\r\n\r\n\t});\r\n\r\n\treturn controller;\r\n} );\n","var nfRadio = Backbone.Radio;\r\n\r\njQuery( document ).ready( function( $ ) {\r\n\trequire( ['views/app/builder', 'controllers/loadControllers', 'views/loadViews'], function( BuilderView, LoadControllers, LoadViews ) {\r\n\r\n\t\tvar NinjaForms = Marionette.Application.extend( {\r\n\r\n\t\t\tinitialize: function( options ) {\r\n\r\n\t\t\t\tvar that = this;\r\n\t\t\t\tMarionette.Renderer.render = function(template, data){\r\n\t\t\t\t\tvar template = that.template( template );\r\n\t\t\t\t\treturn template( data );\r\n\t\t\t\t};\r\n\r\n\t\t\t\t// Trigger an event before we load our controllers.\r\n\t\t\t\tnfRadio.channel( 'app' ).trigger( 'before:loadControllers', this );\r\n\t\t\t\t// Load our controllers.\r\n\t\t\t\tvar loadControllers = new LoadControllers();\r\n\t\t\t\t// Trigger an event after we load our controllers.\r\n\t\t\t\tnfRadio.channel( 'app' ).trigger( 'after:loadControllers', this );\r\n\r\n\t\t\t\t// Trigger an event before we load un-instantiated views\r\n\t\t\t\tnfRadio.channel( 'app' ).trigger( 'before:loadViews', this );\r\n\t\t\t\tvar loadViews = new LoadViews();\r\n\t\t\t\t// Trigger an event after we load un-instantiated views.\r\n\t\t\t\tnfRadio.channel( 'app' ).trigger( 'after:loadViews', this );\r\n\r\n\t\t\t\tnfRadio.channel( 'app' ).reply( 'get:template', this.template );\r\n\t\t\t},\r\n\r\n\t\t\tonStart: function() {\r\n\t\t\t\tvar builderView = new BuilderView();\r\n\t\t\t\t// Trigger our after start event.\r\n\t\t\t\tnfRadio.channel( 'app' ).trigger( 'after:appStart', this );\r\n\r\n\t\t\t\t/*\r\n\t\t\t\t * If we're on the new forms builder, open the add fields drawer.\r\n\t\t\t\t */\r\n\t\t\t\tif ( 0 == nfAdmin.formID ) {\r\n\t\t\t\t\tnfRadio.channel( 'app' ).request( 'open:drawer', 'addField' );\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\ttemplate: function( template ) {\r\n\t\t\t\treturn _.template( $( template ).html(),  {\r\n\t\t\t\t\tevaluate:    /<#([\\s\\S]+?)#>/g,\r\n\t\t\t\t\tinterpolate: /\\{\\{\\{([\\s\\S]+?)\\}\\}\\}/g,\r\n\t\t\t\t\tescape:      /\\{\\{([^\\}]+?)\\}\\}(?!\\})/g,\r\n\t\t\t\t\tvariable:    'data'\r\n\t\t\t\t} );\r\n\t\t\t}\r\n\t\t} );\r\n\t\r\n\t\tvar ninjaForms = new NinjaForms();\r\n\t\tninjaForms.start();\r\n\t} );\r\n} );\ndefine(\"main\", function(){});\n\n"]}